实验5 彩色图像处理与图像变换

news/2024/7/21 5:26:26 标签: 计算机视觉, 图像处理, matlab

文章目录

      • 一、实验目的
      • 二、实验内容
        • 1. 彩色图像平滑。(课本P310 例6.12)
        • 2. 彩色边缘检测。(课本P318 例6.16)
        • 3. 一维小波变换。(课本P364 例7.20)
        • 4. 二维小波变换。(课本P369 例7.22)
        • 5. 小波包分解。(课本P376 例7.24)

一、实验目的

  1. 掌握RGB彩色模型和HSI彩色模型之间的转换方法,以及彩色图像的平滑方法。
  2. 掌握彩色图像边缘检测的方法。
  3. 掌握一维和二维信号的单尺度和多尺度小波变换。
  4. 掌握小波包分解的方法。

二、实验内容

1. 彩色图像平滑。(课本P310 例6.12)

图1显示了一幅RGB图像,请进行以下操作:
(1) 显示图1的红、绿、蓝分量图像。
(2) 显示图1的H、S、I分量图像。
(3) 用大小为 5 × 5 5\times 5 5×5 的平均核分别对图1的R、G、B分量进行平滑,然后混合这些独立平滑后的图像以形成平滑后的全彩色图像。
(4) 保持图1的H分量和S分量不变,仅用大小为 5 × 5 5\times 5 5×5 的平均核对I分量进行平滑,然后把最终的HSI转换成RGB图像以便显示。
(5) 求(3)和(4)中所得到的两幅图像的差值。
(6) 分析实验结果。
在这里插入图片描述

答:
(1)
(2)

matlab">%色调分量
numerator=0.5*((R-G)+(R-B));
denominator=sqrt((R-G).^2+(R-B).*(G-B));
theta=acos(numerator./(denominator+eps));

H = zeros(size(f(:,:,1)));
H(B > G) = 2*pi - theta(B > G);
H(B <= G) = theta(B <= G);
H=H/(2*pi);

%饱和度分量
min_val=min(R,min(G,B));
S=1-3./(R+G+B).*min_val;

%亮度分量
I=1/3*(R+G+B);
subplot(1,3,1);imshow(H);title('色调分量','FontSize',15);
subplot(1,3,2),imshow(S);title('饱和度分量','FontSize',15);
subplot(1,3,3),imshow(I);title('亮度分量','FontSize',15);

在这里插入图片描述
(3)

matlab">%用大小为5×5的平均核分别对图1的R、G、B分量进行平滑

% 定义平均核
kernel = ones(5, 5) / 25;

% 对每个通道应用平滑核
red_channel = imfilter(R, kernel, 'replicate');
green_channel = imfilter(G, kernel, 'replicate');
blue_channel = imfilter(B, kernel, 'replicate');

% 合并三个通道
smoothed_img = cat(3, red_channel, green_channel, blue_channel);

% 显示结果
imshow(smoothed_img);

在这里插入图片描述
(4)

在这里插入图片描述
(5)

matlab">%没有定标时,图片接近0,不是特别清晰
smoothed_img=im2uint8(smoothed_img);
diff=smoothed_img-rgb;
subplot(1,2,1);imshow(diff);title('未调整I分量之后的diff图','FontSize',13);

%将图片重新定标,使得图像更加清晰

% 转换数据类型为double
diff = im2double(diff);
% 仅对I通道执行调整
hsi=rgb_to_hsi(diff);
I=hsi(:,:,3);
I = imadjust(I);
hsi(:,:,3)=I;

diff=hsi_to_rgb(hsi);
subplot(1,2,2);imshow(diff);title('调制I分量之后的diff图','FontSize',13);


function rgb = hsi_to_rgb(hsi)
hsi=im2double(hsi);
H=hsi(:,:,1)*2*pi;
S=hsi(:,:,2);
I=hsi(:,:,3);
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));
%RG 扇区 (0<=H<2*pi/3)
c=find((0<=H) & (H<2*pi/3));
B(c)=I(c).*(1-S(c));
R(c)=I(c).*(1+S(c).*cos(H(c))./cos((pi/3)-H(c)));
G(c)=3*I(c)-(R(c)+B(c));
%BG 扇区 (2*pi/3<=H<4*pi/3)
c=find((2*pi/3<=H) & (H<4*pi/3));
R(c)=I(c).*(1-S(c));
G(c)=I(c).*(1+S(c).*cos(H(c)-2*pi/3)./cos(pi-H(c)));
B(c)=3*I(c)-(R(c)+G(c));
%BR 扇区 (4*pi/3<=H<2*pi)
c=find((4*pi/3<=H) & (H<2*pi));
G(c)=I(c).*(1-S(c));
B(c)=I(c).*(1+S(c).*cos(H(c)-4*pi/3)./cos((5*pi/3)-H(c)));
R(c)=3*I(c)-(B(c)+G(c));

rgb=cat(3,R,G,B);
rgb=im2uint8(rgb);
end

function hsi=rgb_to_hsi(rgb)
R=rgb(:,:,1);
G=rgb(:,:,2);
B=rgb(:,:,3);

%色调分量
numerator=0.5*((R-G)+(R-B));
denominator=sqrt((R-G).^2+(R-B).*(G-B));
theta=acos(numerator./(denominator+eps));

H = zeros(size(rgb(:,:,1)));
H(B > G) = 2*pi - theta(B > G);
H(B <= G) = theta(B <= G);
H=H/(2*pi);

%饱和度分量
min_val=min(R,min(G,B));
S=1-3./(R+G+B).*min_val;

%亮度分量
I=1/3*(R+G+B);


hsi=cat(3,H,S,I);
hsi=im2uint8(hsi);
end

在这里插入图片描述
(6)
可以看到,在RGB色彩模型中对彩色图像做平滑滤波,每个像素的颜色都是邻域中像素的平均颜色。而HSI彩色模型中仅对亮度分量做平均,解除了亮度和色彩信息的联系。两种平滑方法的区别会随着核的增大而变得更为明显。

2. 彩色边缘检测。(课本P318 例6.16)

(1) 请在RGB向量空间中计算图1的梯度。
(2) 请求图1的3幅分量图像的梯度,并通过在每一坐标点 处叠加相应的3幅分量图像的梯度值,合成一幅梯度图像。
(3) 请求(1)和(2)中所得的两幅梯度图像的差的绝对值。

答:

matlab">close all; clear all; clc;
f=imread('1.Lena.tif');
f=im2double(f);
% Sobel 算子
sobel = fspecial('sobel');
sv = sobel';
sh = sobel; 
% 计算 X、Y 方向梯度
Rx = imfilter(f, sv, 'replicate');
Ry = imfilter(f, sh, 'replicate');
Gx = imfilter(f, sv', 'replicate');
Gy = imfilter(f, sh', 'replicate');
Bx = imfilter(f, sv, 'replicate') + imfilter(f, sv', 'replicate');
By = imfilter(f, sh, 'replicate') + imfilter(f, sh', 'replicate');
% 计算 gxx、gyy 和 gxy
gxx = sum(cat(3, Rx, Gy, Bx).^2, 3);
gyy = sum(cat(3, Ry, Gy, By).^2, 3);
gxy = sum(cat(3, Rx, Gy, Bx) .* cat(3, Ry, Gy, By), 3);
% 计算 theta
theta = 0.5 * atan(2*gxy./(gxx - gyy + eps));
%计算 F
F1=sqrt(1/2*((gxx+gyy)+(gxx-gyy).*cos(2*theta)+2*gxy.*sin(2*theta)));
theta1=theta+pi/2;
F2=sqrt(1/2*((gxx+gyy)+(gxx-gyy).*cos(2*theta1)+2*gxy.*sin(2*theta1)));
F = max(F1, F2);
F = mat2gray(F);
figure; imshow(F);
imwrite(F,'边缘检测图像.tif');

在这里插入图片描述
(2)

matlab">%%
figure;
%R、 G、 B 分量梯度图像
RG=sqrt(Rx.^2+Ry.^2);
subplot(131); imshow(RG(:,:,1),[]);title('R分量图像梯度');
GG=sqrt(Gx.^2+Gy.^2);
subplot(132); imshow(GG(:,:,2),[]);title('G分量图像梯度');
BG=sqrt(Bx.^2+By.^2);
subplot(133); imshow(BG(:,:,3),[]);title('B分量图像梯度');
%叠加成一幅梯度图像
F3=RG + GG + BG;
F3=mat2gray(F3);
figure; imshow(F3);
imwrite(F3,'3 幅分量图像叠加的边缘检测图像.tif');

在这里插入图片描述
(3)

matlab">%两幅梯度图像做差
Fd=F-F3;
Fd=abs(Fd);
Fd=mat2gray(Fd);
figure; imshow(Fd);

在这里插入图片描述

3. 一维小波变换。(课本P364 例7.20)

在这里插入图片描述

有一离散函数 f ( x ) = { 1 , 4 , − 3 , 0 } f(x)=\{1,4,-3,0\} f(x)={1,4,3,0} 请根据式(1)所示的哈尔尺度函数系数和式(2)所示的小波函数,请用实验讲义中的两种方法对 进行二尺度小波变换。

h φ ( n ) = { 1 / 2 , n = 0 , 1 0 ,  其他  (1) h_{\varphi}(n)=\left\{\begin{array}{lc} 1 / \sqrt{2}, & n=0,1 \\ 0, & \text { 其他 } \end{array}\right.\tag1 hφ(n)={1/2 ,0,n=0,1 其他 (1)

h ψ ( n ) = { 1 / 2 , n = 0 − 1 / 2 , n = 1 0 ,  其他  (2) h_{\psi}(n)=\left\{\begin{array}{lc} 1 / \sqrt{2}, & n=0 \\ -1 / \sqrt{2}, & n=1 \\ 0, & \text { 其他 } \end{array}\right.\tag2 hψ(n)= 1/2 ,1/2 ,0,n=0n=1 其他 (2)

答:

方法一:

matlab">fn = [1,4,-3,0];
h_phi = [1/sqrt(2),1/sqrt(2)];
h_psi = [-1/sqrt(2),1/sqrt(2)];

% 一级小波分解
wf1 = conv(fn,h_psi);%高通细节分量
wf1 = wf1(2:2:end-mod(length(wf1),2));
sca1 = conv(fn,h_phi);%低通尺度分量
sca1 = sca1(2:2:end-mod(length(sca1),2))

% 二级小波分解,对尺度空间V_{J-1}进行分解
wf2 = conv(sca1,h_psi);
wf2 = wf2(2:2:end-mod(length(wf11),2));
sca2 = conv(sca1,h_phi);
sca2 = sca2(2:2:end-mod(length(sca2),2));

方法二:

matlab">fn=[1,4,-3,0];
[ca,cd] = dwt(fn,'haar');
[ca1, cd1]=dwt(ca,'haar')

4. 二维小波变换。(课本P369 例7.22)

图2给出了一幅512×512的花瓶和窗台图像,请对其进行以下操作:
在这里插入图片描述
(1) 请求图2的一尺度小波分解后图像。
(2) 请求图2的二尺度小波分解后图像。

答:
(1)

matlab">f=imread('4.一幅512×512的图像.tif'); 
f=im2double(f); 
[cA,cH,cV,cD]=dwt2(f, 'haar'); 
cA=mat2gray(cA); 
cH=mat2gray(cH); 
cV=mat2gray(cV); 
cD=mat2gray(cD); 
w=[cA,cH;cV,cD];
figure; imshow(w); 

在这里插入图片描述
(2)

matlab">[cA2,cH2,cV2,cD2]=dwt2(cA, 'haar'); 
cA2=mat2gray(cA2); 
cH2=mat2gray(cH2); 
cV2=mat2gray(cV2); 
cD2=mat2gray(cD2);
w1=[cA2,cH2;cV2,cD2];
w2=[w1,cH;cV,cD];
figure;imshow(w2);

在这里插入图片描述

5. 小波包分解。(课本P376 例7.24)

图3给出了一幅扫描的指纹图像,请对其进行二尺度、全小波包分解。

在这里插入图片描述

答:

matlab">clear all;close all;clc;
f = imread('5.扫描的指纹图像.tif');
f=im2double(f);
[cA1,cH1,cV1,cD1]=dwt2(f, 'haar');
cA1=mat2gray(cA1);
cH1=mat2gray(cH1);
cV1=mat2gray(cV1);
cD1=mat2gray(cD1);

[cA2,cH2,cV2,cD2]=dwt2(cA1,'haar');
cA2=mat2gray(cA2);
cH2=mat2gray(cH2);
cV2=mat2gray(cV2);
cD2=mat2gray(cD2);
w2=[cA2,cH2;cV2,cD2];

[cA2,cH2,cV2,cD2]=dwt2(cH1,'haar');
cA3=mat2gray(cA2);
cH3=mat2gray(cH2);
cV3=mat2gray(cV2);
cD3=mat2gray(cD2);
w3=[cA3,cH3;cV3,cD3];

[cA2,cH2,cV2,cD2]=dwt2(cV1,'haar');
cA4=mat2gray(cA2);
cH4=mat2gray(cH2);
cV4=mat2gray(cV2);
cD4=mat2gray(cD2);
w4=[cA4,cH4;cV4,cD4];

[cA2,cH2,cV2,cD2]=dwt2(cD1,'haar');
cA5=mat2gray(cA2);
cH5=mat2gray(cH2);
cV5=mat2gray(cV2);
cD5=mat2gray(cD2);
w5=[cA5,cH5;cV5,cD5];

%二尺度分解
wt1=[w2,cH1;cV1,cD1];
figure;imshow(wt1);
%全分解
wall=[w2,w3;w4,w5];
figure;imshow(wall)

在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/275286.html

相关文章

网络设备中VRRP协议和Linux服务器中keepalived的两个区别

1、什么是VRRP&#xff1f;keepalived又是什么&#xff1f; VRRP全称是Virtual Router Redundancy Protocol&#xff0c;即虚拟路由冗余协议。它的主要目的是在一个网络中提供冗余的路由。当一个三层网络设备或服务器出现故障时&#xff0c;VRRP可以确保网络仍能正常工作。VRR…

QT+OpenCV配置

QTOpenCV配置 1 下载CMake2 安装CMake3 下载OPenCV4 配置环境变量4.1 配置QT环境变量4.2 配置CMake环境变量4.3 重启电脑生效 5 CMake编译OPenCV5.1 解决报错 6 测试 1 下载CMake 链接&#xff1a;https://cmake.org/download/ 2 安装CMake 3 下载OPenCV 链接&#xff1a;htt…

markdown二元运算符

符号markdown名称 \pm \pm正负/加减 ∓ \mp ∓\mp负正/减加 \times \times乘号 ⋅ \cdot ⋅\cdot点乘号 \div \div除号 ∣ \mid ∣\mid整除 ∤ \nmid ∤\nmid不整除 ⊕ \oplus ⊕\oplus异或

Ansible自动化部署工具|各个模块的使用

Ansible自动化部署工具|各个模块的使用 一、自动化运维工具—Ansible二、安装Ansible查询webserver组中主机的日期 三 Ansible常用模块(1) ansible命令行模块(2) command模块(3) shell模块(4) cron模块(5) user模块(6) grup模块(7) copy模块(8) file模块(9) ping模块(10) servi…

Vue.js按键修饰符及v-model修饰符

目录 一、按键修饰符 &#xff08;1&#xff09;回车键按键修饰符示例 &#xff08;2&#xff09;自定义按键修饰符示例 二、v-model修饰符 &#xff08;1&#xff09;.lazy &#xff08;2&#xff09;.number &#xff08;3&#xff09;.trim 一、按键修饰符 v-on指令用…

利用snpEff对基因型VCF文件进行变异注释的详细方法

利用snpEff对VCF文件进行变异注释 群体遗传研究中&#xff0c;在获得SNP位点后,我们需要对SNP位点进行注释&#xff0c;对这些SNP位点进行更深的了解。 snpEff是一个用于对基因组单核苷酸多态性(SNP)进行注释的软件&#xff0c;snpEff软件可以用于对VCF文件进行变异注释&#x…

分享串口接收中断只能接收到一个字节的其中一个原因

问题&#xff1a; 今天来分享一个我这两天遇到的一个很狗血的问题&#xff0c;就是我在写一个新项目串口部分时候&#xff0c;发现串口怎么只能接收到一个字节&#xff0c;因为我用的是接收中断RBEN吗&#xff0c;每接收到一个字节都会中断一次。 可是这次我发现我每次怎么只…

百城巡展 | 人大金仓4月“双向奔赴”告一段落

人间最美四月天&#xff0c;人大金仓走过上海、宁波、合肥&#xff0c;联合伙伴发布医疗、金融、信息安全、电子档案等多个关键领域的信创联合解决方案&#xff0c;共同为数字基础设施的安全和可持续发展贡献力量&#xff0c;吸引了线上线下近7000人参与。 左右滑动&#xff0c…