简述:MATLAB中使用Laplace算子对彩色图像进行边缘检测的方法
2017-10-31 15:42
796 查看
截止到本文写作时,据了解,MATLAB R2017B中尚无针对彩色图像进行边缘检测的函数,因此,笔者在课程设计的压力下思考了这个问题,并将其整理为文字,以供分享
本文所用软件为MATLAB R2017B,经测试,稳中提供代码可在MATLAB R2016A上完美运行,更低版本未测试
实验中采用Laplace算子进行边缘检测;这张图片为这次试验中使用的原图,可以随意下载使用
产生的效果图:
方法二 提取彩色图像的RGB分量,分别进行边缘检测后再进行叠加合成
a. 提取RGB分量
效果图:
效果图:
c. 对上一步结果进行叠加合成
效果图:
可以看到,在这张图中,不论是鹿的轮廓还是鹿背后起伏的地形,其形状都得到了很好的保留,然而美中不足的是,这张图片中有很多的蓝色噪点,这些也是需要通过某种方法消除的,最简单的方法就是将该图片进行一次灰度图的转换
d. 对此方法的改进
效果图:
可以看到,这张图片的效果有了明显的改善,噪点的数量下降很多,边缘相对于第一种方法也更加清晰。因此这个效果是比较理想的
完整的源代码
这次实验一共三个源文件,分别贴在下面:
对于此实验的一些思考
以目前的测试结果看,这份代码非常适合有大片色块且色块色差比较大的图片,而对于一些整体色调一致的图片而言,方法一二区别不大,但是二依然存有微弱优势
对此提出一种尚未证实的猜想,即对于色调几乎保持一致的图片,对RGB分量进行边缘检测后,舍弃效果较差的分量,再进行叠加合成并灰度化,效果应该比方法二要好一些,现在不知道是不是可以对RGB分量的强度进行微调而不是直接舍弃,如果可以分别调整RGB分量的话,配合平滑滤波,效果应该会更好。
这个猜想笔者会进行测试后分享到博客,如果对这篇文章有什么疑问或者批评指正,请在评论区留言~_~
本文所用软件为MATLAB R2017B,经测试,稳中提供代码可在MATLAB R2016A上完美运行,更低版本未测试
实验中采用Laplace算子进行边缘检测;这张图片为这次试验中使用的原图,可以随意下载使用
方法一 将彩色图转换为灰度图再进行边缘检测
这种方法的缺点是相比于方法二来说,会损失更多信息量,具体代码如下I_origin2 = imread('img3.jpg'); I_gray = rgb2gray(I_origin2); Edge_gray = edge(I_gray, 'log');
产生的效果图:
方法二 提取彩色图像的RGB分量,分别进行边缘检测后再进行叠加合成
a. 提取RGB分量
Instance_R = I_origin2(:, :, 1); Instance_G = I_origin2(:, :, 2); Instance_B = I_origin2(:, :, 3);
效果图:
b. 对RGB分量分别进行边缘检测
Edge_R = edge(Instance_R, 'log'); Edge_G = edge(Instance_G, 'log'); Edge_B = edge(Instance_B, 'log');
效果图:
c. 对上一步结果进行叠加合成
rgb = im2uint8(cat(3, Edge_R, Edge_G, Edge_B));
效果图:
可以看到,在这张图中,不论是鹿的轮廓还是鹿背后起伏的地形,其形状都得到了很好的保留,然而美中不足的是,这张图片中有很多的蓝色噪点,这些也是需要通过某种方法消除的,最简单的方法就是将该图片进行一次灰度图的转换
d. 对此方法的改进
I_RGB = rgb2gray(rgb);
效果图:
可以看到,这张图片的效果有了明显的改善,噪点的数量下降很多,边缘相对于第一种方法也更加清晰。因此这个效果是比较理想的
完整的源代码
这次实验一共三个源文件,分别贴在下面:
% image_edge.m
% 探究对真彩色图像的边缘检测方法
% ----两种边缘检测方法(均以Laplace算子为例)
% -----------------1. 真彩色图像->灰度图->边缘检测
% -----------------2. 真彩色图像->分解为RGB分量->对分量进行边缘转换->对转换结果进行合并->剔除不合适的分量
%初始化运行环境
close all; clear; clc;
warning off;
% 读取图像并适当进行压缩
I_origin = imread('img3.jpg');
[size_x, size_y, size_z] = size(I_origin);
if size_x > 1080
I_origin2 = imresize(I_origin, 1080 / double(size_x));
else
I_origin2 = I_origin;
end
figure(1), imshow(I_origin2), title('原图');
% ---- 方法一
I_gray = rgb2gray(I_origin2);
figure('Name', '对灰度图的边缘检测');
subplot(1, 2, 1), imshow(I_origin2), title('原图');
subplot(1, 2, 2), imshow(I_gray), title('灰度图');
Edge_gray = edge(I_gray, 'log');
% ---- 方法二
% ---------------提取RGB分量并显示
Instance_R = I_origin2(:, :, 1); Instance_G = I_origin2(:, :, 2); Instance_B = I_origin2(:, :, 3);
figure('Name', '原图的RGB分量');
subplot(2, 2, 1), imshow(I_origin2), title('Origin');
subplot(2, 2, 2), imshow(Instance_R), title('Vector R');
subplot(2, 2, 3), imshow(Instance_G), title('Vector G');
subplot(2, 2, 4), imshow(Instance_B), title('Vector B');
% ---------------对RGB分量进行边缘检测并合并
Edge_R = edge(Instance_R, 'log'); Edge_G = edge(Instance_G, 'log'); Edge_B = edge(Instance_B, 'log');
rgb = im2uint8(cat(3, Edge_R, Edge_G, Edge_B));
figure('Name', 'RGB分量的边缘检测');
subplot(2, 2, 1), imshow(I_origin2), title('Origin');
subplot(2, 2, 2), imshow(Edge_R), title('Laplace Vector R');
subplot(2, 2, 3), imshow(Edge_G), title('Laplace Vector G');
subplot(2, 2, 4), imshow(Edge_B), title('Laplace Vector B');
figure('Name', '两种检测方法的对比');
subplot(1, 2, 1), imshow(Edge_gray), title('方法一');
subplot(1, 2, 2), imshow(rgb), title('方法二');
%EOF
% image_sub1.m % 探究对真彩色图像的边缘检测方法 % ----两种边缘检测方法(均以Laplace算子为例) % !!!所有sub文件均需在image_edge.m执行后执行!!! % 灰度图的边缘检测与彩色图分别除去RGB分量的边缘检测对比 figure('Name', 'image_sub1'); subplot(2, 2, 1), imshow(Edge_gray), title('Gray'); subplot(2, 2, 2), imshow(cat(3, zeros(size(Edge_R)), Edge_G, Edge_B)), title('Without R'); subplot(2, 2, 3), imshow(cat(3, Edge_R, zeros(size(Edge_G)), Edge_B)), title('Without G'); subplot(2 ,2, 4), imshow(cat(3, Edge_R, Edge_G, zeros(size(Edge_B)))), title('Without B'); % EOF
% image_sub2.m % 探究对真彩色图像的边缘检测方法 % ----两种边缘检测方法(均以Laplace算子为例) % !!!所有sub文件均需在image_edge.m执行后执行!!! % 对彩色图执行RGB边缘检测后取灰度化与灰度化边缘检测对比 figure('Name', 'image_sub2'); subplot(1, 2, 1), imshow(Edge_gray), title('Gray'); subplot(1, 2, 2), imshow(rgb2gray(rgb)), title('RGB to Gray'); %EOF
对于此实验的一些思考
以目前的测试结果看,这份代码非常适合有大片色块且色块色差比较大的图片,而对于一些整体色调一致的图片而言,方法一二区别不大,但是二依然存有微弱优势
对此提出一种尚未证实的猜想,即对于色调几乎保持一致的图片,对RGB分量进行边缘检测后,舍弃效果较差的分量,再进行叠加合成并灰度化,效果应该比方法二要好一些,现在不知道是不是可以对RGB分量的强度进行微调而不是直接舍弃,如果可以分别调整RGB分量的话,配合平滑滤波,效果应该会更好。
这个猜想笔者会进行测试后分享到博客,如果对这篇文章有什么疑问或者批评指正,请在评论区留言~_~
相关文章推荐
- 使用roberts Prewitt Sobel 三种算子对raw格式图像进行边缘检测
- 13. 用Roberts、Sobel、Prewitt和Laplace算子对一幅灰度图像进行边缘检测。观察异同。
- 图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)
- Matlab多种图像边缘检测方法
- 使用OpenCV对图像作边缘检测(Canny、Sobel、Laplace)
- OpenCV之imgproc 模块. 图像处理(2)实现自己的线性滤波器 给图像添加边界 Sobel 导数 Laplace 算子 Canny 边缘检测
- Matlab多种图像边缘检测方法
- 【OpenCV3图像处理】边缘检测:Sobel算子,Laplace算子,Canny算子
- opencv图像边缘检测使用,先做平滑处理在进行边缘检测
- matlab图像边缘检测的简单方法
- 使用Scharr 算子进行边缘检测
- 图像边缘检测经典算子及MATLAB实现
- 图像边缘检测经典算子及MATLAB实现
- CImage对象使用罗伯特算子进行边缘检测
- 图像边缘检测及提取方法总结(含Matlab代码)
- Matlab使用Prewitte算子进行边缘检测
- 图像边缘检测经典算子及MATLAB实现
- canny 算子实现图像边缘检测(详细过程附源码)
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- 【MATLAB图像处理3】 canny边缘检测 (附源码)