您的位置:首页 > 编程语言 > MATLAB

简述:MATLAB中使用Laplace算子对彩色图像进行边缘检测的方法

2017-10-31 15:42 796 查看
截止到本文写作时,据了解,MATLAB R2017B中尚无针对彩色图像进行边缘检测的函数,因此,笔者在课程设计的压力下思考了这个问题,并将其整理为文字,以供分享

本文所用软件为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分量的话,配合平滑滤波,效果应该会更好。

这个猜想笔者会进行测试后分享到博客,如果对这篇文章有什么疑问或者批评指正,请在评论区留言~_~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息