图像分割、边缘检测、轮廓检测的区别与联系。

背景

在图像处理中,轮廓检测 (Contour Detection), 边缘检测 (Edge Detection),图像分割 (Image Segmentation)三个概念联系十分紧密,但从具体概念来说并不一样。下面是这三个概念的直观定义:

  • 图像分割是指将数字图像分割成多个图像小块(即像素集合,如超像素)的过程。
  • 边缘检测是检测数字图像中明暗变化剧烈或者说是不变化不连续的像素点。
  • 轮廓检测是指检测图像中的对象边界。

图像分割和边缘检测从定义就可以很好的区分,轮廓检测和边缘检测的区别是在语义层次上,轮廓检测更偏向于关注上层语义,主要目标是为了确定图像中的语义对象的边界;而边缘检测只关注的是图像中像素点的变化。另外,从结果的表现形式来看,轮廓检测得到的轮廓一定是封闭的,而边缘检测得到的边缘与图像分割得到的分割边界通常都不是封闭的。图像的轮廓检测通常可以先检测边缘,再将检测到的边缘进行进一步处理,得到图像的轮廓。图像分割也需要先对边缘进行检测,因此可以说边缘检测是图像分割与轮廓检测的基础性工作。

算法

图像分割,边缘检测,轮廓检测在图像处理中都是研究都年的问题了,每个问题都有不少经典算法,下面是每个问题典型的方法:

  • 图像分割:N-cut, Meanshift, Watershed
  • 边缘检测: Canny, Sobel, Roberts, Prewitt, Log
  • 轮廓检测: gPb

实例

下面用一些实际图像分割,边缘检测和轮廓检测的例子,为了表示敬意,采用姑姑女神李若彤的照片作为示例:
原图:李若彤
图像分割算法:

clc;
clear all;
im=imread(‘G:\\liruotong.jpg’);
im1=rgb2gray(im);
im1=medfilt2(im1,[3 3]); %中值滤波去除图像噪声%
BW = edge(im1,'sobel'); %采用 sobel 边缘检测算法检测边缘
[imx,imy]=size(BW);
msk=[0 0 0 0 0;
     0 1 1 1 0;
     0 1 1 1 0;
     0 1 1 1 0;
     0 0 0 0 0;];
B=conv2(double(BW),double(msk)); %Smoothing  image to reduce the number of connected components
L = bwlabel(B,8);% Calculating connected components
mx=max(max(L))
% There will be mx connected components.Here U can give a value between 1 and mx for L or in a loop you can extract all connected components
% If you are using the attached car image, by giving 17,18,19,22,27,28 to L you can extract the number plate completely.
[r,c] = find(L==17);  
rc = [r c];
[sx sy]=size(rc);
n1=zeros(imx,imy); 
for i=1:sx
    x1=rc(i,1);
    y1=rc(i,2);
    n1(x1,y1)=255;
end % Storing the extracted image in an array
subplot(121)
imshow(im);
subplot(122)
imshow(B);

分割结果:
图像分割

边缘检测算法:

I=imread('G:\\liruotong.jpg');
IGray = rgb2gray(I);
bw=edge(IGray,'prewitt',0.04);
subplot(121)
imshow(I)
subplot(122)
imshow(bw)

边缘检测结果
边缘检测

轮廓检测算法:

I = imread('G:\\liruotong.jpg');
IGray = rgb2gray(I);
d1 = double(IGray)./255;  %# Load the image, scale from 0 to 1
subplot(1,2,1); imshow(I); title('Original Image');    %# Plot the original image
d = edge(d1,'canny',.6);                    %# Perform Canny edge detection
ds = bwareaopen(d,40);                      %# Remove small edge objects
iout = d1;
BW = ds;
iout(:,:,1) = iout;                           %# Initialize red color plane
iout(:,:,2) = iout(:,:,1);                    %# Initialize green color plane
iout(:,:,3) = iout(:,:,1);                    %# Initialize blue color plane
iout(:,:,2) = min(iout(:,:,2) + BW, 1.0);     %# Add edges to green color plane
iout(:,:,3) = min(iout(:,:,3) + BW, 1.0);     %# Add edges to blue color plane
subplot(1,2,2); imshow(iout); 
title('Result');  %# Plot the resulting image

轮廓检测结果

轮廓检测

参考引文

[1] http://blog.csdn.net/rns521/article/details/6910440
[2] http://stackoverflow.com/questions/5853116/contour-detection-in-matlabhttp://stackoverflow.com/questions/5853116/contour-detection-in-matlab
[3] http://www.mathworks.com/matlabcentral/fileexchange/8031-image-segmentation---extraction
[4] Arbelaez P, Maire M, Fowlkes C, et al. Contour detection and hierarchical image segmentation[J]. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2011, 33(5): 898-916.


捐赠

如果我的文章对您有启迪,而您的经济条件许可,您可以扫描下方二维码,向我进行小额奖励,您的认可是我创作的最大动力!

© 2017 风陵渡 All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero