如何检测彩色照片的边缘?

How to detect edges of a colored photo?

我正在尝试实施来自 Mathworks 网站的盲解卷积算法示例,但在进行边缘检测时遇到问题,因为您不能对 RGB 照片使用边缘检测功能。所以我将照片转换为 YUV 但之后我不知道我应该按什么顺序进行处理,我什至不知道我是否使用了正确的方法。

我为所有三个 (y,u,v) 应用了 edge() 函数,然后我使用 YUV 到 RGB 方法再次组合它们。没用,获取不到最终的WEIGHT值。

我的代码在下面,示例 link 在 http://www.mathworks.com/help/images/deblurring-with-the-blind-deconvolution-algorithm.html

Img = imread('image.tif');
PSF = fspecial('motion',13,45); 
Blurred = imfilter(Img,PSF,'circ','conv'); 
INITPSF = ones(size(PSF));
[J P] = deconvblind(Blurred,INITPSF,30);

%   RGB to YUV
R=Img(:,:,1); G=Img(:,:,2); B=Img(:,:,3);
Y=round((R+2*G+B)/4);
U=R-G;
V=B-G;

% finding edges for Y,U,V
WEIGHT1 = edge(Y,'sobel',.28);
se1 = strel('disk',1);
se2 = strel('line',13,45);
WEIGHT1 = ~imdilate(WEIGHT1,[se1 se2]);
WEIGHT1 = padarray(WEIGHT1(2:end-1,2:end-1),[1 1]);

WEIGHT2 = edge(U,'sobel',.28);
se1 = strel('disk',1);
se2 = strel('line',13,45);
WEIGHT2 = ~imdilate(WEIGHT2,[se1 se2]);
WEIGHT2 = padarray(WEIGHT2(2:end-1,2:end-1),[1 1]);

WEIGHT3  = edge(V,'sobel',.28);
se1 = strel('disk',1);
se2 = strel('line',13,45);
WEIGHT3 = ~imdilate(WEIGHT3,[se1 se2]);
WEIGHT3 = padarray(WEIGHT3(2:end-1,2:end-1),[1 1]);


% YUV to RGB again
G=round((WEIGHT1-(WEIGHT2+WEIGHT3)/4));
R=WEIGHT2+G;
B=WEIGHT3+G;
WEIGHT(:,:,1)=G; WEIGHT(:,:,2)=R; WEIGHT(:,:,3)=B;

P1 = P;
P1(find(P1 < 0.01))= 0;

[J2 P2] = deconvblind(Blurred,P1,50,[],double(WEIGHT));
figure, imshow(J2)
title('Newly Deblurred Image');
figure, imshow(P2,[],'InitialMagnification','fit')
title('Newly Reconstructed PSF')  

我不会在这里讨论 deconvblind 去模糊,但让我向您展示彩色图像的边缘检测是如何工作的。

% load an image
I = imread('peppers.png');

% note that this is a RGB image. 
e = edge(I, 'sobel');  

会失败,因为 edge 需要 2D 图像,而 RGB 或 YUV 图像是 3D,在三维是颜色通道的意义上。

有几种方法可以解决这个问题。一种是将图像转换为灰度,使用

gray = rgb2gray(I);

然后可以根据“gray”中的灰度强度将其传递到边缘,到 return 边缘。

e = edge(gray,'sobel'); % also try with different thresholds for sobel.

如果你真的对每个通道中的边缘信息感兴趣,你可以简单地将各个通道分别传入边缘。例如,

eRed = edge(I(:,:,1), 'sobel'); % edges only in the I(:,:,1): red channel.
eGreen = edge(I(:,:,2), 'sobel');
eBlue = edge(I(:,:,3), 'sobel');

然后根据 eRedeGreeneBlue 中的每一个的外观,您可以潜在地组合然后使用逻辑 'or',这样的结果如果任何通道独立地认为它是边缘,则它是边缘。

eCombined = eRed | eGreen | eBlue;

您最初所做的可能是无意的,因为 YUV 色彩空间会扭曲边缘感。 R 平面中的边缘可能不是 Y、U 或 V 平面中的边缘,因此您需要确保使用正确的色彩空间来检测边缘,以便之后可以将它们组合起来,如所示RGB 颜色空间较早。

最终代码形式如下,

Img = imread('image.tif');
PSF = fspecial('motion',13,45);
Blurred = imfilter(Img,PSF,'circ','conv');
INITPSF = ones(size(PSF));
[J P] = deconvblind(Blurred,INITPSF,30);

eRed = edge(Img(:,:,1), 'sobel');
eGreen = edge(Img(:,:,2), 'sobel');
eBlue = edge(Img(:,:,3), 'sobel');
WEIGHT = eRed | eGreen | eBlue;
se1 = strel('disk',1);
se2 = strel('line',13,45);
WEIGHT = ~imdilate(WEIGHT,[se1 se2]);
WEIGHT = padarray(WEIGHT(2:end-1,2:end-1),[1 1]);
figure
imshow(WEIGHT)
title('Weight Array')

P1 = P;
P1(find(P1 < 0.01))= 0;

WEIGHT2 = repmat(WEIGHT,[1 1 3]);
WEIGHT3 = im2double(WEIGHT2);

[J2 P2] = deconvblind(Blurred,P1,50,[],WEIGHT3);
figure, imshow(J2)
title('Newly Deblurred Image');
figure, imshow(P2,[],'InitialMagnification','fit')
title('Newly Reconstructed PSF')

我不能 post 图片 yet.so 我正在提供 link 的 outputs.The 最后输出,新恢复,有问题,正如我在标题中指出的photo.I 的猜测,仍然存在数据类型问题。 输出linkhttp://imgur.com/a/dDF2N