彩色图像的空间域滤波

2023-05-16

(1) RGB彩色空间向HSI彩色空间的转换:

自定义一个函数,实现RGB彩色空间向HSI彩色空间的转换,要求该函数的输入参数为RGB彩色图像,输出参数为HSI彩色图像。

根据RGB彩色空间到HSI彩色空间的转换公式,编写函数 RGBtoHSI(pho)

% pho 表示输入图像路径(包括图像名+后缀)
function hsi = RGBtoHSI(pho)
ima=imread(pho); %读取输入图像
rgb=double(ima); %将图像转为双精度类型
rgb=rgb/255; %归一化
R=rgb(:,:,1); %提取第1个通道
G=rgb(:,:,2); %提取第2个通道
B=rgb(:,:,3); %提取第3个通道
 
angle=(acos(1/2*((R-G)+(R-B))./sqrt((R-G).^2+(R-B).*(G-B))))*180/pi;
H=angle; %计算H(色调)通道
H(B>G)=360-H(B>G); %将 B>G 对应位置上的值赋值为 2*pi - angle
S=1-3./(R+G+B+eps).*min(min(R,G),B); %计算S(色饱和度)通道
I=1/3*(R+G+B+eps); %计算I(亮度)通道
 
hsi=cat(3,H/360,S,I); %合成3个通道,为HSI图像


输入原图像并进行显示,将原图像从RGB彩色空间向HSI彩色空间转换,显示HSI彩色空间的图像 useRGBtoHSI('EXP6.tif')

% pho 表示输入图像路径(包括图像名+后缀)
function [] = useRGBtoHSI(pho)
ima=imread(pho); %读入输入图像
subplot(121); %设置输入图像的显示位置(1行2列的第1个位置)
imshow(ima); %显示输入图像
title('RGB彩色图像'); %设置输入图像的标题
hsi=RGBtoHSI(pho); %将输入图像由RGB空间向HSI空间转化
subplot(122); %设置输出图像的显示位置(1行2列的第2个位置)
imshow(hsi); %显示输出图像
title('HSI彩色图像'); %设置输出图像的标题
%imwrite(hsi,'EXP6_HSI.tif','tif');

输出结果如下:

注意:

在编写程序的过程中运行程序曾出现如下结果:


解决:

HSI彩色图像输出结果与正确结果的颜色不一样。思考发现,H通道处并未做归一化处理,即 H=H/360才是正确值。

(2)HSI彩色空间向RGB彩色空间的转换:

自定义一个函数,实现HSI彩色空间向RGB彩色空间的转换,要求该函数的输入参数为HSI彩色图像,输出参数为RGB彩色图像。

根据HSI彩色空间到RGB彩色空间的转换公式,编写函数 HSItoRGB(hsi)

% hsi 表示HSI空间图像
function rgb = HSItoRGB(hsi)
%ima=imread(pho);
hsi=double(hsi); %转化为双精度类型
[r c m]=size(hsi); %计算hsi的行列和维度
H=hsi(:,:,1); %提取H分量
S=hsi(:,:,2); %提取S分量
I=hsi(:,:,3); %提取I分量
H=H*360; %将色调值变为原来的范围[0°,360°]
R=zeros(r,c); %R分量
G=zeros(r,c); %G分量
B=zeros(r,c); %B分量
 
inv=0<=H & H<120; %RG扇区(inv是H中值在RG扇区的位置)
B(inv)=I(inv).*(1-S(inv)); %根据在RG扇区时的计算公式计算B分量
R(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在RG扇区时的计算公式计算R分量
G(inv)=3*I(inv)-(R(inv)+B(inv)); %根据在RG扇区时的计算公式计算G分量
 
inv=120<=H & H<240; %GB扇区(inv是H中值在GB扇区的位置)
H(inv)=H(inv)-120;
R(inv)=I(inv).*(1-S(inv)); %根据在GB扇区时的计算公式计算R分量
G(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在GB扇区时的计算公式计算G分量
B(inv)=3*I(inv)-(R(inv)+G(inv)); %根据在GB扇区时的计算公式计算B分量
 
inv=240<=H & H<360; %BR扇区(inv是H中值在BR扇区的位置)
H(inv)=H(inv)-240;
G(inv)=I(inv).*(1-S(inv)); %根据在BR扇区时的计算公式计算G分量
B(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在BR扇区时的计算公式计算B分量
R(inv)=3*I(inv)-(G(inv)+B(inv)); %根据在BR扇区时的计算公式计算R分量
 
%将各个分量的灰度级拉伸到256个灰度级上
R=R*255;
G=G*255;
B=B*255;
rgb=cat(3,R,G,B); %合成彩色图像
rgb=uint8(rgb); %转为8位无符号整型

输入原图像,将原图像从RGB彩色空间向HSI彩色空间转换,显示HSI彩色空间的图像,并将该图像向RGB彩色空间转化,得到结果进行显示  useHSItoRGB('EXP6.tif')

% pho 表示输入图像路径(包括图像名+后缀)
function [] = useHSItoRGB(pho)
hsi=RGBtoHSI(pho); %将输入图像转化为HSI空间彩色图像
subplot(121); %设置HSI空间彩色图像的显示位置(1行2列的第1个位置)
imshow(hsi); %显示HSI空间彩色图像
title('HSI彩色图像'); %设置HSI空间彩色图像的标题
rgb=HSItoRGB(hsi); %由HSI空间转化为RGB空间
subplot(122); %设置输出图像的显示位置(1行2列的第2个位置)
imshow(rgb); %显示输出图像
title('RGB彩色图像'); %设置输出图像的标题

输出结果如下:

注意:

在编写程序的过程中运行程序曾出现如下结果:


不仅如此,其中还出现一些奇特的图片,观察原图像转为HSI彩色图像后中H通道的数值,再看看作为实验2小题输入的HSI彩色图像的H通道的数值,就可以发现这两个通道的数值本应该一样却不一样了。我能想到的原因应该是作为实验2小题的输入图像——HSI彩色图像是我由RGBHSI得到的(输出保存),其中保存的过程中HSI彩色图像H通道内的值转化为了256灰度级来呈现(保存)。所以第2小题的输入图像不能由第1小题的输入结果保存得到,而是直接使用第1小题的结果作为输入参数。

解决方法:对原程序进行修改——输入参数改为转化后的HSI

还出现过如下结果:


该结果是经上述问题后修改的程序运行的结果,再次查看原程序,会发现H还未乘以360

解决方法:对原程序进行修改——H分量乘以360

接下来说的是:原图像与由原图像转化HSI彩色图像再转为RGB彩色图像的对比,查看两者差值,判断RGB——>HSIHSI——>RGB两个函数的正确性。

errorAnaly('EXP6.tif')

% pho 表示输入图像路径(包括图像名+后缀)
% 该函数显示输入图像和其HSI空间图像、由HSI空间转化来的RGB图像、以及原图像与由HSI空间转化来的RGB图像的差值图像
% 观察在转化过程是否出现过大误差
function []=errorAnaly(pho)
ima=imread(pho); %读入输入图像
subplot(221); %设置输入图像的显示位置(2行2列的第1个位置)
imshow(ima); %显示输入图像
title('原图像'); %设置输入图像的标题
 
hsi=RGBtoHSI(pho); %将输入图像转化为HSI空间彩色图像
subplot(222); %设置HSI空间彩色图像的显示位置(2行2列的第2个位置)
imshow(hsi); %显示HSI空间彩色图像
title('HSI彩色图像'); %设置HSI空间彩色图像的标题
 
rgb=HSItoRGB(hsi); %由HSI空间转化为RGB空间
subplot(223); %设置输出图像的显示位置(2行2列的第3个位置)
imshow(rgb); %显示输出图像
title('RGB彩色图像'); %设置输出图像的标题
 
erra=ima-rgb; %原图像与由HSI空间转化来的RGB图像的差值图像
subplot(224); %设置差值图像的显示位置(2行2列的第4个位置)
imshow(erra); %显示差值图像
title('原图像与RGB彩色图像的差值'); %设置差值图像的标题

输出结果如下:

由差值图像可见,原图像与RGB彩色图像的“一致性”,说明两个函数的正确性。


(3)要求在HSI彩色空间中,实现对含噪图像EXP6.tif的空间域平滑处理,滤波器为5×5高斯均值滤波器(滤波器模板如下图所示),并在RGB彩色空间中显示处理前后的结果。

输入图像在HSI彩色空间中的空间域平滑处理:

使用上次我们介绍到的自定义的空间滤波器( http://blog.csdn.net/qq_15096707/article/details/50061003 ),加入5x5高斯均值滤波器,对原函数进行修改补充,如下:

%filter_type 所选择的滤波器类型。有:3x3高斯均值滤波器、5x5高斯均值滤波器、中值滤波器、最大值滤波器、最小值滤波器
%filter_size 定义滤波器大小,如 filter_size=[3 3];
function ima2 = mySpatialFilter(ima, filter_type, filter_size)
%ima=imread(pho); %根据路径读取原图像
ima=double(ima); %转化为双精度类型
[r c]=size(ima); %读取原图像的行数和列数
 
%设置高斯均值滤波器只有3x3或5x5大小的
if strcmp(filter_type, '3x3高斯均值滤波器')
    filter_size=[3 3];
end
 
if strcmp(filter_type, '5x5高斯均值滤波器')
    filter_size=[5 5];
end
m=filter_size(1); %读取设置的滤波器模板的大小
n=filter_size(2);
 
rs=r+m-1; %计算边界填充后的图像大小(填充模板大小)
cs=c+n-1;
tIma=zeros(rs,cs); %创建一个边界填充后的矩阵
tIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2)=ima; %矩阵中间填充原图像灰度级
 
%以最邻近的边界作为边界填充的灰度值
%先填充上边界
for i=1:(m-1)/2
    tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(1);
end
%填充下边界
for i=rs-(m-1)/2+1:rs
    tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(r);
end
%填充左边界
for i=1:(n-1)/2
    tIma(:,i)=tIma(:,(n-1)/2+1);
end
%填充右边界
for i=cs-(n-1)/2+1:cs
    tIma(:,i)=tIma(:,cs-(n-1)/2);
end
 
rIma=zeros(rs,cs);
%遍历该矩阵,套用滤波模板
for i=1:rs-m+1
    for j=1:cs-n+1
        %读取模板覆盖处的图像
        tempIma=tIma(i:i+m-1, j:j+n-1);
        %计算该模板覆盖的中心位置
        centerR=i+(m-1)/2;
        centerC=j+(m-1)/2;
        switch filter_type
            case '3x3高斯均值滤波器'
                %定义3 x 3的高斯均值滤波器模板
                module=[1 2 1; 2 4 2; 1 2 1];
                module=module(:)';
                %为邻域以该模板为系数进行加权求平均,得出的值赋值得邻域中心
                rIma(centerR,centerC)=module*tempIma(:)/sum(module);
            case '5x5高斯均值滤波器'
                %定义5 x 5的高斯均值滤波器模板
                module=[1 2 3 2 1; 2 5 6 5 2; 3 6 8 6 3; 2 5 6 5 2; 1 2 3 2 1];
                module=module(:)';
                %为邻域以该模板为系数进行加权求平均,得出的值赋值得邻域中心
                rIma(centerR,centerC)=module*tempIma(:)/sum(module);
            case '中值滤波器'
                %为邻域内的值排序,求得中值,将该值赋值给邻域中心
                tempIma=sort(tempIma(:));
                rIma(centerR,centerC)=tempIma((length(tempIma)+1)/2,1);
            case '最大值滤波器'
                %求邻域中的最大灰度值,将该值赋值给邻域中心
                rIma(centerR,centerC)=max(tempIma(:));
            case '最小值滤波器'
                %求邻域中的最小灰度值,将该值赋值给邻域中心
                rIma(centerR,centerC)=min(tempIma(:));
            otherwise
                error('不存在该滤波器');
        end
    end
end
%去除原先填充的边界,得出最终结果
ima2=rIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2);
ima2=uint8(ima2);

将原图像转为HSI空间图像,在HSI空间中对I分量使用5x5高斯均值滤波器,再将HSI空间向RGB空间转化,显示结果:

useHSIGS('EXP6.tif')

% pho 表示输入图像路径(包括图像名+后缀)
% 该函数输入原图像,将原图像转化为HSI彩色图像,在HSI空间使用5x5高斯均值滤波器,再将结果转为RGB输出
function []=useHSIGS(pho)
ima=imread(pho); %读取输入图像
subplot(121); %设置输入图像的显示位置(1行2列的第1个位置)
imshow(ima); %显示输入图像
title('输入图像'); %设置输入图像的标题
 
hsi=RGBtoHSI(pho); %将输入图像由RGB空间向HSI空间转化
%在使用5x5高斯均值滤波器前,需要将I分量拉伸到[0 255]灰度区间
%为什么只对I分量进行操作呢?I分量与图像的彩色信息无关。
%注意差异性:
%RGB空间中的平均是不同彩色的平均
%HIS空间中仅仅是强度的平均,色调H和饱和度S均保持不变
hsi(:,:,3)=mySpatialFilter(hsi(:,:,3)*255,'5x5高斯均值滤波器',[5 5]);
hsi(:,:,3)=hsi(:,:,3)/255; %将I分量再转回[0 1]区间
rgb=HSItoRGB(hsi); %由HSI空间再转为RGB空间
 
subplot(122); %显示输出图像
imshow(rgb); %显示输出图像
title('使用5x5高斯均值滤波器的输出图像'); %设置输出图像的标题

输出结果如下:


注意:

为什么在HSI空间使用高斯均值滤波器时只对I分量进行处理?

I分量与图像的彩色信息无关,H&S分量与人感受颜色的方式紧密相连。

注意差异性:

RGB空间中的锐化是不同彩色的平均;

HSI空间中仅仅是强度的锐化,色调H和饱和度S均保持不变。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

彩色图像的空间域滤波 的相关文章

随机推荐

  • 使用CSS将图片转换成黑白(灰色、置灰)

    转载请注明来自 张鑫旭 鑫空间 鑫生活 http www zhangxinxu com http www zhangxinxu com wordpress p 61 2547 可能早就知道 xff0c 像汶川这种糟糕的日子网站全灰在IE下是
  • CSS中常用的四种选择器

    Css中常用的四种选择器 1 类选择器 xff08 class 选择器 xff09 基本使用 xff1a 类选择器 属性名 属性值 案例 xff1a 类选择器 s1 background color pink font weight bol
  • Apache的下载安装(主要说的 64位)及问题

    今天重装完win10系统 xff0c 就重新下载安装 Apache 虽说之前有安装过Apache xff08 原来系统是win7 64位 xff09 xff0c 也成功运行过Apache服务器 xff0c 但是让我重新下载安装 xff0c
  • 使用PHP实现文件下载

    这里写了如何使用PHP实现文件下载的程序 xff0c 主要是为了方便自己查找 xff0c 也为了方便大家查阅学习 xff08 当然网上也有其他类似的代码 xff09 其中详细解析看原程序注释 PHP实现文件下载程序 xff1a FileDo
  • 向Web站点发送GET请求、POST请求,并从Web站点取得响应

    建议在查看以下代码之前 xff0c 先去了解有关HTTP请求和HTTP响应的相关知识 xff08 如请求与响应的内容 xff09 这里提供了一个发送GET POST请求的工具类 xff0c 源代码摘抄自 疯狂 Android讲义 xff08
  • 使用PHP进行图片的copy

    今天学习了PHP的文件编程 xff0c 其中PHP自身提供了复制文件的函数 xff08 copy xff09 自己也写了一个功能差不多的复制图片的函数 xff0c 以此在这里记录一下 在说该函数之前 xff0c 先介绍一下使用PHP创建 删
  • 使用PHP实现文件上传

    这里使用PHP实现文件的上传 xff0c 由在浏览器这边选择文件 xff0c 上传到服务器 其中 xff0c 在上传文件中 xff0c 考虑到对上传文件大小的限制 类型限制等问题 xff08 当然可以根据我们需要修改对上传的文件的限制 xf
  • 电子爱好者必备,强烈推荐这些常用工具

    工欲善其事 xff0c 必先利其器 xff01 要想 DIY xff0c 工具同样重要 xff01 下面按照工具的必须程度从 初学者 至 发烧友 逐级提出建议 xff0c 供大家参考 xff01 首先明确一点 xff1a 本配置是针对电子类
  • php中的绘图技术

    在php中 xff0c 使用php绘图 xff0c 在访问php文件时可以出现我们绘制的图像 php绘图技术可以应用于报表的开发 验证码的设计 在介绍php绘图技术之前 xff0c 我们首先需要了解一下php中的绘图坐标系 xff1a ph
  • jpgraph绘图库的安装与配置

    以前用 PHP作图时必须要掌握复杂抽象的画图函数 xff0c 或者借助一些网上下载的画 柱形图 饼形图的类来实现 没有一个统一的chart类来实现图表的快速开发 现在我们有了一个新的选择 xff1a JpGraph 专门提供图表的类库 它使
  • 图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸

    这次我们要处理的是对图像 进行旋转 操作 xff0c 具体要求 xff0c 如下 xff1a 自定义一个图像的仿射变换函数 xff0c 用于旋转给定的输入图像 xff0c 该函数的输入参数包括处理前的图像和旋转角度 输入的角度为正数 xff
  • Android+PHP 使用HttpClient提交POST的请求,使用JSON解析响应

    这里介绍一下如何让自己的Android程序具有联网功能 当然首先要有一台服务器 xff0c 如果只是进行测试的话 xff0c 可以使用局域网代替 xff08 手机连电脑wifi xff09 要求电脑已配置好Apache 43 PHP环境 下
  • Android Google开源库——Volley的简单使用

    介绍一下Android Google开源库 Volley的简单使用 volley 项目地址 https github com smanikandan14 Volley demo JSON xff0c 图像等的异步下载 xff1b 网络请求的
  • Mysql远程登陆及常用命令

    上次我们租用了阿里云的服务器 xff0c 使用windows系统 xff0c 在其服务器上安装了wamp xff0c 对于Mysql数据库这方面的远程登陆知识有些缺欠 Mysql数据库的远程登陆可使我们在自己电脑上连接服务器的数据库 xff
  • 让网页装进Android手机(将html+css+js打包成Android应用)(简单的)

    今晚尝试了一下 xff0c 将自己简单写的网页 xff08 html 43 css 43 js xff09 打包成Android应用装进手机 xff08 当然如果网页做得好的话 xff0c 采用响应式布局 xff0c 即可在手机上完美展示
  • 图像的直方图均衡化和比特平面分层

    xff08 1 xff09 自定义一个函数 xff0c 当输入为一幅图像 EXP3 1 tif 时 xff0c 能输出该图像的直方图 计算输入图像的直方图 getHist function H 61 getHist pho ima 61 i
  • 空间域滤波:图像平滑和锐化

    xff08 1 xff09 自定义一个空间域平滑滤波函数 xff0c 以达到滤除指定类型噪声 如高斯 噪声和椒盐噪声等 的 目的 xff0c 该函数的输入参数包括滤波器类型filter type 如 高斯均值滤波 中值滤波 最大 小值滤波等
  • 图像的频率域高斯低通滤波

    xff08 1 xff09 自定义一个图像的频率域高斯低通滤波处理函数 xff0c 要求该函数的输入参数包括处理前的图像ima和距频率矩形中心的距离D0 截止频率 xff0c 输出参数为滤波处理后的图像im2 自定义的高斯低通滤波器 xff
  • 2021-07-28_Ubuntu18.04如何关闭Xorg图形界面使用tty纯命令跑程序?

    痛点1 xff1a 显卡只有8G xff0c 经常gradient overflow或者CUDA OOM 痛点2 xff1a 主机连接数4k显示器 xff0c 经常系统卡住 xff0c 只有鼠标能动 xff0c 某度知道热心网友说等几分钟试
  • 彩色图像的空间域滤波

    xff08 1 xff09 RGB彩色空间向 HSI 彩色 空间的转换 xff1a 自定义一个函数 xff0c 实现RGB 彩色空间向 HSI 彩色 空间的转换 xff0c 要求该函数的输入参数为RGB彩色图像 xff0c 输出参数为HSI