1. 彩色图像锐化
用线性空间滤波器锐化一幅RGB彩色图像的基本步骤和第三章学过的差不多,但使用的是锐化滤波器,我们考虑使用的还是拉普拉斯算子锐化图像。
代码如下:
h=imread('C:\Users\sh qian\Desktop\flower.jpg');
lapmask=[1 1 1;1 -8 1;1 1 1];
filter=imfilter(h,lapmask,'replicate');
fen=imsubtract(h,filter);
imshow(fen);
figure,imshow(h);
subplot(1,2,1),imshow(h);
title('原图');
subplot(1,2,2),imshow(fen);
title('经过锐化后的图像');
效果如下:
在使用imfilter时,RGB图像完全可以当做单色图像处理,避免了对分量的拆分和合并,imsubtract函数表示相减,因为锐化重要的一步就是原图像与经过滤波后的图像进行相减。
2. 在RGB向量空间直接处理
2.1 采用梯度的彩色边缘检测
我在书中的附录里找到了实现RGB图像的彩色梯度的函数,我理解的大概意思是,根据传入的(一定是)RGB图像,以及一个Sobel掩膜sh,因为sh是近似于垂直方向的梯度,所以还需要一个水平方向的掩膜sh’。然后对这个RGB图像进行分通道滤波,而且要在垂直和水平方向分别滤波。接下来,就是一系列的数学公式的推导(还得慢慢理解吧),最后计算每个平面的梯度。
colorgrad函数代码如下:
function [VG,A,PRG]=colorgrad(f,T)
if ndims(f)~=3 || size(f,3) ~=3
error('Input image must be RGB');
end
sh=fspecial('sobel');
sv=sh';
Rx=imfilter(double(f(:,:,1)),sh);
Ry=imfilter(double(f(:,:,1)),sv);
Gx=imfilter(double(f(:,:,2)),sh);
Gy=imfilter(double(f(:,:,2)),sv);
Bx=imfilter(double(f(:,:,3)),sh);
By=imfilter(double(f(:,:,3)),sv);
gxx=Rx.^2+Gx.^2+Bx.^2;
gyy=Ry.^2+Gy.^2+By.^2;
gxy=Rx.*Ry+Gx.*Gy+Bx.*By;
A=0.5*(atan(2*gxy./(gxx-gyy+eps)));
G1=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*A)+2*gxy.*sin(2*A));
A=A+pi/2;
G2=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*A)+2*gxy.*sin(2*A));
G1=G1.^0.5;
G2=G2.^0.5;
VG=mat2gray(max(G1,G2));
%计算每个平面的梯度
RG=sqrt(Rx.^2+Ry.^2);
GG=sqrt(Gx.^2+Gy.^2);
BG=sqrt(Bx.^2+By.^2);
PRG=mat2gray(RG+GG+BG);
if nargin==2
VG=(VG>T).*VG;
PRG=(PRG>T).*PRG;
end
测试例子
c=imread('tem.jpg');
[VG,A,PPG]=colorgrad(c);
figure,imshow(VG);
figure,imshow(PPG);
subplot(2,2,3),imshow(b);
title('原图');
imhist(PPG,255);
imhist(VG,255);
title('VG直方图');
subplot(2,2,4),imhist(PPG,255);
title('PPG直方图');
效果如图:
其实正常情况下PPG图像的水平边缘比VG中的对应边缘更弱,主要原因是红色和绿色平面的梯度产生两个垂直边缘,蓝色平面的梯度产生单个水平边缘。为形成PPG而相加这三个梯度会产生亮度两倍于水平边缘亮度的垂直边缘。