数字图像处理Matlab-彩色图像处理(附代码)

2,431 阅读6分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

1.Objectives:

1、学习 RGB、Indexed 和 Gray 图像间转换函数 2、掌握彩色图像平滑与锐化的算法 3、 学习彩色图像的分割方法

2.Experiment Content:

学 习 和 掌 握 下 列 函 数 : rgb2ind, rgb2gray, gray2ind, ind2gray, ind2rgb,colormap, dither, cat, colorseg

3.Experiment Principle:

见书《数字图像处理》

(冈萨雷斯著作,电子工业出版社于2009年12月1日出版)

4.Experiment Steps Result and Conlusion:

1、 使用 RGB、Indexed 和 Gray 图像间转换函数

对图像“Fig0630(01)(strawberries_fullcolor).tif”使用 rgb2ind 分别 产生 8 色抖动和非抖动图像;使用 rgb2gray 实现图像转换,并使 用函数 dither 产生其抖动形式的图像。 在这里插入图片描述 CON:可以转换后的灰度图只有八种灰度的阶度,视觉并不如之前的信息 抖动的结果的灰度交界并没有很明显了,这是因为抖动让其在交界处有了过渡 在这里插入图片描述 CON; 这仍然是八色的索引图像,因此跟原图比较,其颜色色彩显得不那么丰富。对于抖动的图像,我们可以看到在一些颜色变化幅度比较大的情况下,会有一些小点点的,这就是抖动后的效果,可能在这幅图的好处效果,不是很明显,抖动的目的就是使得图像的颜色过渡不那么突然,变得平滑

2、彩色图像平滑锐化

对图像“ “Fig0604(a)(iris).tif”在 RGB 空间实现彩色图像的平滑(w=ones(25)./(25*25))与锐化(w= [1 1 1 1 1; 1 1 1 1 1; 1 1 -24 1 1 ; 1 1 1 1 1; 1 1 1 1 1];)(函数 imfilter)

在 HSI 空间实现彩色图像的平滑(w=ones(25)./(25*25)),(函数 imfilter, rgb2hsi, cat),观察仅平滑亮度分量(intensity)和平滑全 部三个分量结果的差别。
在这里插入图片描述 在这里插入图片描述第一张图进行滤波就是在rgb上滤波,看到整个图像变得平滑,比较模糊,右上图整个图像只要有颜色变化的地方都变得尖锐起来,能看到明显的颜色变化,在hsi空间上的滤波,看到旨在i强度上平滑的效果,使得各个颜色的强度变化不大,就是每种颜色都比较突出,hsi所有的进行滤波,发现整个图就看不太清楚。

3、彩色图像分割

用 colorseg 函 数 实 现 基 于 肤 色 的 人 脸 分 割 。 对 图 像 “'Fig0636(woman_baby_original).tif”在 HSI 空间,用函数 colorseg 分别用参数“euclidean”和“mahalanobis”实现人脸分割。 在这里插入图片描述 这是我们做图像分割的原图,右边是我们选出的感兴趣的,想要分割出来的区域,我们选择的是婴儿的皮肤,想要分割出图像中皮肤的部分。 在这里插入图片描述 这是使用第一种分割方法,大体上我们看出能基本分出人的皮肤部分,从原图中看,我们选择的区域中儿童额头皮肤较亮,因此在选出的区域中,儿童左半边脸较为暗的区域就并没有被分割出来经过第二种分割方法分割得到的图像,基本完成了所有皮区域的分割,效果很不错。因此我们需要通过此方案按照椭球的距离来进行分割再在HSI空间进行分割的时候,发现图片全白,无法进行分割。故选择在RDB空间进行分割。

【附录】实现代码

程序一:

clear all;clc;
f=imread('E:\数字图像处理\程序与图像\图像库\Fig0630(01)(strawberries_fullcolor).tif');
[f1,map1]=rgb2ind(f,8,'nodither');%将rgb图像转化为索引图像,且索引图像为8种颜色,不抖动
figure(1);
subplot(1,2,1);
imshow(f1,map1);
title("rgb2ind无抖动");
[f2,map2]=rgb2ind(f,8,'dither');%将rgb图像转化为索引图像,且索引图像为8种颜色,有抖动
subplot(1,2,2);
imshow(f2,map2);
title("rgb2indy有抖动"); 

f3=rgb2gray(f);%将rgb图像转化为灰度图像,且灰度图像为8种颜色,不抖动
figure(2);
subplot(1,2,1);
imshow(f3,[]);
title("rgb2gray无抖动");
f4=dither(f3);
subplot(1,2,2);imshow(f4,[]);
title("rgb2gray有抖动");

程序二

clear all;clc;
f=imread('E:\数字图像处理\程序与图像\图像库\Fig0604(a)(iris).tif');
w=ones(25)./(25*25);
f_filtered=imfilter(f,w,'replicate');
figure(1);
subplot(1,3,1);
imshow(f,[]);
title("原图");
subplot(1,3,2);
imshow(f_filtered,[]);
title("rgb平滑后图像");
fb=f;w=[1 1 1 1 1;1 1 1 1 1;1 1 -24 1 1;1 1 1 1 1;1 1 1 1 1];%拉普拉斯算子
fen=fb-imfilter(fb,w,'replicate');%锐化处理
subplot(1,3,3);imshow(fen,[]);title("rgb锐化后图像");  

addpath('E:\大三下\数字图像处理(通一)\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件 

hsi=rgb2hsi(f);%得到hsi空间的图像
h=hsi(:,:,1);%得到hsi空间的色调,饱和度,亮度分量
s=hsi(:,:,2);i=hsi(:,:,3);
w=ones(25)./(25*25);%滤波器参数
i_filtered=imfilter(i,w,'replicate');%对亮度进行平滑处理
hsi1=cat(3,h,s,i_filtered);
f1=hsi2rgb(hsi1);%转化为rgb图像
figure(2);
subplot(1,3,1);imshow(f,[]);title("原图");
subplot(1,3,2);imshow(f1,[]);title("hsi亮度平滑");

h_filtered=imfilter(h,w,'replicate');
i_filtered=imfilter(i,w,'replicate');
s_filtered=imfilter(s,w,'replicate');
hsi2=cat(3,h_filtered,s_filtered,i_filtered);
f2=hsi2rgb(hsi2);%转化为rgb图像
subplot(1,3,3);imshow(f2,[]);title("hsi三个分量平滑");

程序三:

clear all;clc;
rgb_image=imread('E:\数字图像处理\程序与图像\图像库\Fig0636(woman_baby_original).tif');
figure(2);
imshow(rgb_image);
mask=roipoly(rgb_image);%获得感兴趣区域,感兴趣区域值为1,其余值为0 
red=immultiply(mask,rgb_image(:,:,1));
green=immultiply(mask,rgb_image(:,:,2));
blue=immultiply(mask,rgb_image(:,:,3));%分别获得感兴趣区域rgb矩阵的值;
g=cat(3,red,green,blue);
figure(3);
imshow(g);
%显示感兴趣区域

%求感兴趣区域的均值与协方差矩阵
[M,N,K]=size(g);
I=reshape(g,M*N,3);%将g变成一个m*n行3列的矩阵
idx=find(mask);%返回mask中不为0区域的行坐标(这一步是先把图像都变成一列矩阵处理的,因此返回的是一个列矩阵)
I=double(I(idx,1:3));
[C,m]=covmatrix(I);%求协矩阵与均值
d=diag(C);%返回矩阵对角线行的元素
sd=sqrt(d);%求出标准差 

E25=colorseg('euclidean',rgb_image,25,m);%这里使用'euclidean'进行分割,选取阈值为25
M25=colorseg('mahalanobis',rgb_image,25,m,C);%这里使用'mahalanobis'进行分割,选取阈值为25
figure(4);
subplot(211);imshow(E25);
subplot(212);imshow(M25);

图像:上文都以截图展示

码字不易,都看到这里了不如点个赞哦~
我还写了很多文章,欢迎关注我哦~

在这里插入图片描述