1、分量、平滑和合成
%% 读取图像像素信息,将像素矩阵中的数据转换成double型并提取R、G、B分量
rgb1=imread('i_flower.png'); rgb=im2double(rgb1);
fR=rgb(:,:,1);fG=rgb(:,:,2);fB=rgb(:,:,3);
%% 用传统的邻域平均单独平滑 R、G、B 3 个分量图像,再对平滑后的分量图像合成
w=fspecial('average'); %生成均值滤波器
fR_filtered=imfilter(fR,w); fG_filtered=imfilter(fG,w); fB_filtered=imfilter(fB,w); % 对R、G、B层数组分别做平滑滤波处理
rgb_filtered=cat(3,fR_filtered,fG_filtered,fB_filtered); I1=(fR+fG+fB)/3; %处理后的R,G,B数组合并成三维矩阵,对处理后的R,G,B数组取均值,得到I1分量
%% 将 RGB 图像转换到 HSI 模型,仅对强度分量 I 进行平滑处理,而保持色度和饱和度分量不变,再将其转换到 RGB 空间进行显示。
tmp1=min(min(fR,fG),fB); tmp2=fR+fG+fB; tmp2(tmp2==0)=eps; %计算三图层中的最小值tmp1、总和tmp2、tmp2空值赋值为eps防止除数为0
S=1-3.*tmp1./tmp2; %赋值S分量
tmp1=0.5*((fR-fG)+(fR-fB)); tmp2=sqrt((fR-fG).^2+(fR-fB).*(fG-fB));%计算色调的两个参数
theta=acos(tmp1./(tmp2+eps)); %计算arccos
H1=theta; %赋值H1分量
H1(fB>fG)=2*pi-H1(fB>fG); % 角度转换。fB>fG的,对色调进行归一化使HSI值在[0,1]范围内
H1=H1/(2*pi); %H分量除以2*pi进行归一化
H1(S==0)=0; %将H数组中S数组为0的位置赋值为0
w=fspecial('average'); I=imfilter(I1,w); H=H1*2*pi; %生成均值滤波器,对I分量做平滑滤波处理,对H分量赋值
%% 分区域将HSI转换为RGB
R=zeros(size(rgb1,1),size(rgb1,2));
G=zeros(size(rgb1,1),size(rgb1,2));
B=zeros(size(rgb1,1),size(rgb1,2)); %分别初始化等大小的R、G、B矩阵
ind=find((H>=0)&(H<2*pi/3)); %找个H数组中大于等于0并小于2*pi/3的位置,赋值为ind
%分区域计算得到对应位置B、R、G矩阵的像素值:
B(ind)=I(ind).*(1.0-S(ind)); % RG区域:[0°,120°)
R(ind)=I(ind).*(1.0+S(ind).*cos(H(ind))./cos(pi/3.0-H(ind)));
G(ind)=1.0-(R(ind)+B(ind));
ind=find((H>2*pi/3)&(H<4*pi/3)); % GB区域:[120°,240°)
H(ind)=H(ind)-pi*2/3; R(ind)=I(ind).*(1.0-S(ind));
G(ind)=I(ind).*(1.0+S(ind).*cos(H(ind))./cos(pi/3.0-H(ind)));
B(ind)=1.0-(R(ind)+G(ind));
ind=find((H>=4*pi/3)&(H<2*pi));% BR区域:[240°,360°)
H(ind)=H(ind)-pi*4/3;
G(ind)=I(ind).*(1.0-S(ind));
B(ind)=I(ind).*(1.0+S(ind).*cos(H(ind))./cos(pi/3.0-H(ind))); R(ind)=1.0-(G(ind)+B(ind));
hsi_rgb=cat(3,R,G,B); % % 合并R,G,B
%% 二者结果之差
diff=(abs(hsi_rgb-rgb_filtered));
%% 显示图片
figure;
subplot(4,4,1);
imshow(fR),title('R分量');
subplot(4,4,2);
imshow(fG),title('G分量');
subplot(4,4,3);
imshow(fB),,title('B分量');
subplot(4,4,4);
imshow(rgb1),,title('原图');
subplot(4,4,5);
imshow(fR_filtered),title('R分量平滑');
subplot(4,4,6);
imshow(fG_filtered),title('G分量平滑');
subplot(4,4,7);
imshow(fB_filtered),,title('B分量平滑');
subplot(4,4,8);
imshow(rgb_filtered),,title('三分量平滑合成');
subplot(4,4,9);
imshow(H1),title('H分量');
subplot(4,4,10);
imshow(S),title('S分量');
subplot(4,4,11);
imshow(I1),title('I分量');
subplot(4,4,12);
imshow(I),title('I分量平滑');
subplot(4,4,13);
imshow(hsi_rgb),title('仅I分量平滑RGB');
subplot(4,4,14);
imshow(diff),title('二种结果之差');
2、分量、锐化和合成
%% 读取彩色图像,将像素矩阵中的数据转换成double型并提取R、G、B分量
rgb1=imread('i_flower.png'); rgb=im2double(rgb1);
fR=rgb(:,:,1);fG=rgb(:,:,2);fB=rgb(:,:,3);
%% 用传统的 Laplacian 分别锐化 R、G、B 3 个分量图像,再对锐化后的分量图像合成
lapMatrix=[1 1 1;1 -8 1;1 1 1]; % 拉普拉斯滤波模板-八方向
fR_filtered=imfilter(fR,lapMatrix,'replicate');
fG_filtered=imfilter(fG,lapMatrix,'replicate');
fB_filtered=imfilter(fB,lapMatrix,'replicate');% 对R、G、B层分别做锐化滤波处理
rgb_tmp=cat(3,fR_filtered,fG_filtered,fB_filtered); % 将处理后的R,G,B数组合并成三维矩阵
rgb_filtered=imsubtract(rgb,rgb_tmp); % 锐化后和原图二者结果之差
%% RGB 图像转换到 HSI 模型,仅对强度分量 I 进行锐化处理
I1=(fR+fG+fB)/3; % 对R,G,B数组取均值得到I分量
tmp1=min(min(fR,fG),fB); tmp2=fR+fG+fB; tmp2(tmp2==0)=eps; % 计算三图层中的最小值tmp1、总和tmp2、tmp2空值赋值为eps防止除数为0
S=1-3.*tmp1./tmp2; % 赋值S分量
tmp1=0.5*((fR-fG)+(fR-fB)); tmp2=sqrt((fR-fG).^2+(fR-fB).*(fG-fB)); % 计算色调的两个参数
theta=acos(tmp1./(tmp2+eps)); % 计算arccos
H1=theta; % 赋值H1分量
H1(fB>fG)=2*pi-H1(fB>fG); % 角度转换,fB>fG的,对色调进行归一化使HSI值在[0,1]范围内
H1=H1/(2*pi); % H分量除以2*pi进行归一化
H1(S==0)=0; % 将H数组中S数组为0的位置赋值为0
lapMatrix=[1 1 1;1 -8 1;1 1 1]; % 拉普拉斯滤波模板-八方向
I=imfilter(I1,lapMatrix,'replicate'); % 对强度分量 I 进行锐化处理
%% 显示图像
figure;
subplot(4,4,1);
imshow(fR),title('R分量');
subplot(4,4,2);
imshow(fG),title('G分量');
subplot(4,4,3);
imshow(fB),,title('B分量');
subplot(4,4,4);
imshow(rgb1),,title('原图');
subplot(4,4,5);
imshow(fR_filtered),title('R分量锐化');
subplot(4,4,6);
imshow(fG_filtered),title('G分量锐化');
subplot(4,4,7);
imshow(fB_filtered),title('B分量锐化');
subplot(4,4,8);
imshow(rgb_filtered),title('三分量锐化合成');
subplot(4,4,9);
imshow(H1),title('H分量');
subplot(4,4,10);
imshow(S),title('S分量');
subplot(4,4,11);
imshow(I1),title('I分量');
subplot(4,4,12);
imshow(I),title('I分量锐化');
H=H1*2*pi; % 对H分量赋值
R=zeros(size(rgb1,1),size(rgb1,2));
G=zeros(size(rgb1,1),size(rgb1,2));
B=zeros(size(rgb1,1),size(rgb1,2)); %分别初始化等大小的R、G、B矩阵
%% 对强度分量 I 进行锐化处理后分区域将其转换到 RGB 空间进行显示
%分区域计算得到对应位置B、R、G矩阵的像素值:
ind=find((H>=0)&(H<2*pi/3)); % RG区域:[0°,120°)
B(ind)=I(ind).*(1.0-S(ind));
R(ind)=I(ind).*(1.0+S(ind).*cos(H(ind))./cos(pi/3.0-H(ind)));
G(ind)=1.0-(R(ind)+B(ind));
ind=find((H>2*pi/3)&(H<4*pi/3)); % GB区域:[120°,240°)
H(ind)=H(ind)-pi*2/3;
R(ind)=I(ind).*(1.0-S(ind));
G(ind)=I(ind).*(1.0+S(ind).*cos(H(ind))./cos(pi/3.0-H(ind)));
B(ind)=1.0-(R(ind)+G(ind));
ind=find((H>=4*pi/3)&(H<2*pi)); % BR区域:[240°,360°)
H(ind)=H(ind)-pi*4/3;
G(ind)=I(ind).*(1.0-S(ind));
B(ind)=I(ind).*(1.0+S(ind).*cos(H(ind))./cos(pi/3.0-H(ind)));
R(ind)=1.0-(G(ind)+B(ind));
hsi_rgb=cat(3,R,G,B); % 合并R,G,B
diff=(abs(hsi_rgb-rgb_filtered));% 二者结果之差
subplot(4,4,13);
imshow(hsi_rgb),title('仅I分量锐化RGB');
subplot(4,4,14);
imshow(diff),title('二种结果之差');
3、向量梯度边缘
rgb=imread('fly.png'); % 读取图像
sob=fspecial('sobel'); % 生成用于提取边缘的滤波器
%% 对R、G、B图层的垂直和水平方向分别求导做边缘滤波处理
% 计算梯度向量的参数
Rx=imfilter(double(rgb(:,:,1)),sob,'replicate'); % R 水平方向 线性空间滤波函数,replicate表示图像大小通过复制外边界的值来扩展
Ry=imfilter(double(rgb(:,:,1)),sob','replicate'); % R 垂直方向
Gx=imfilter(double(rgb(:,:,2)),sob,'replicate'); % G 水平方向
Gy=imfilter(double(rgb(:,:,2)),sob','replicate'); % G 垂直方向
Bx=imfilter(double(rgb(:,:,3)),sob,'replicate'); % B 水平方向
By=imfilter(double(rgb(:,:,3)),sob','replicate'); % B 垂直方向
gxx=Rx.^2+Gx.^2+Bx.^2; gyy=Ry.^2+Gy.^2+By.^2;gxy=Rx.*Ry+Gx.*Gy+Bx.*By; % 计算RGB三图层的垂直、水平方向平方和、点乘后求和
theta=0.5*(atan(2*gxy./(gxx-gyy+eps))); %计算每个位置的最大变化率方向
G1=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*theta)+2*gxy.*sin(2*theta)); %计算每个位置的最大变化率方向
theta=theta+pi/2; % 将变化率方向逆时针旋转90°
G2=0.5*((gxx+gyy)+(gxx-gyy).*cos(2*theta)+2*gxy.*sin(2*theta)); %旋转后计算每个点在对应方向上变化率的幅值
% 缩放到范围[0,1],通过在每个(x,y)处取最大值来形成rgb_gradian。
G1=G1.^0.5;
G2=G2.^0.5; % 开平方
rgb_gradiant=mat2gray(max(G1,G2)); % 取两个幅值每个点的最大值
%2
figure
subplot(1,2,1);
imshow(rgb),title('彩色原图');
subplot(1,2,2);
imshow(rgb_gradiant),title('向量梯度边缘');