如何检测彩色照片的边缘?
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');
然后根据 eRed
、eGreen
和 eBlue
中的每一个的外观,您可以潜在地组合然后使用逻辑 '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
我正在尝试实施来自 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');
然后根据 eRed
、eGreen
和 eBlue
中的每一个的外观,您可以潜在地组合然后使用逻辑 '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