实验三 图像分割与描述

一、实验目的:
(1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。
(2)掌握图像分割方法,熟悉常用图像描述方法。
二、实验原理
1.肤色检测
肤色是人类皮肤重要特征之一,在检测人脸或手等目标时常采用肤色检测的方法,将相关区域从图像中分割出来。
肤色检测方法:
肤色检测方法有很多,但无论是基于不同的色彩空间还是不同的肤色模型,其根本出发点在于肤色分布的聚集性,即肤色的颜色分量一般聚集在某个范围内。通过大量的肤色样本进行统计,找出肤色颜色分量的聚集范围或用特殊的分布模型去模拟肤色分布,进而实现对任意像素颜色的判别。
不同彩色空间肤色分布范围:
① RGB彩色空间
据统计资料,肤色在RGB模型中的分布范围基本满足以下条件:
(1)在均匀光照下:R>95且G>40且B>20 且 max{R,G,B}一min{R,G,B}>15且|R一G|>15且R>G且R>B。
(2)在闪光或侧向照明环境下:R>220且G>210且B>170且|R一G≤15且R>B且G>B。
② YCbCr彩色空间
据统计资料,肤色在YCbCr空间的分布范围为77≤C,≤127,133≤C,≤173。
③ HSV彩色空间
HSV空间建立的肤色模型要求满足0°≤H≤25°或335°≤H≤360°且0.2≤S≤0.6且0.4V。
肤色模型
肤色模型是根据大量样本的统计数据建立以确定肤色的分布规律,进而判断像素的色彩是否属于肤色或与肤色相似程度的模型。常用的有阙值模型、高斯模型和椭圆模型。
1)阈值模型
國值模型是用数学表达式明确肤色分布范围的建模方法。这类方法依据肤色分布范围进行检测,判断简单、明确、快捷,但需要选择合适的颜色空间及合适的参数。
2)高斯肤色模型
利用高斯函数模拟肤色在CbCr色度空间的分布。
在这里插入图片描述

其实,
在这里插入图片描述

为色度向量的均值和协方差矩阵,可通过多种方式获取,数值略有区别。
2.图像平滑
图像平滑是指受传感器和大气等因素的影响,遥感图像上会出现某些亮度变化过大的区域,或出现一些亮点(也称噪声)。这种为了抑制噪声,使图像亮度趋于平缓的处理方法就是图像平滑。图像平滑实际上是低通滤波,平滑过程会导致图像边缘模糊化。
图像平滑的方法包括:插值方法,线性平滑方法,卷积法等等。这样的处理方法根据图像噪声的不同进行平滑,比如椒盐噪声,就采用线性平滑方法!
3.皮肤区域分割
所采取的肤色分割的方法为:首先根据肤色在RGB空间分布统计进行初略非肤色过滤,初步去除图像中的非肤色;然后根据肤色在CgCr空间分布范围统计,进行肤色的第二次分割,获取肤色分割图像;在对肤色区域进行中值滤波,提高肤色检测率。
⑴基于RGB空间非肤色像素的初步过滤
对于图像中一些非肤色的像素点,若呈现过红、过蓝、过绿等特征,可通过设置取值范围初步过滤这些非肤色像素点。具体操作过程如下:
①据统计,人眼的像素具有特征:R<70,G<40,B<20.这样使得眼睛更加容易提取像素,减少亮度低的像素被误判为肤色像素的概率。
②据统计,过红、过绿像素大多具有特征R+G>500,可剔除这些像素点。
③据统计,当R<160,G<160,B<160,过红、过绿像素大多数具有R>G>B,可剔除这些像素点。
⑵基于YCgCr空间的肤色分割
肤色YCbCr颜色空间是一种常用的肤色检测的色彩模型,其中Y代表亮度,Cr代表光源中的红色分量,Cb代表光源中的蓝色分量。人的肤色在外观上的差异是由色度引起的,不同人的肤色分布集中在较小的区域内。肤色的YCbCr颜色空间CbCr平面分布在近似的椭圆区域内,通过判断当前像素点的CbCr是否落在肤色分布的椭圆区域内,就可以很容易地确认当前像素点是否属于肤色。将图像转换到YCbCr空间并且在CbCr平面进行投影,可以采集到肤色的样本点。

将CbCr平面均分为许多小区域,将每个区域的中心点CbCr色度值作为当前区域的特征值,对肤色区域像素值进行遍历,如果当前像素值落在该区域内则替换当前区域特征值。
RGB转换为YCbCr
在这里插入图片描述

4.图像融合
图像融合(Image Fusion) 是指综合多幅输入图像的信息,以获得更高质量输出图 像的过程与融合前的多幅图像相比,融合后的图像应更加适于进一步的观察或处理。图像融合属于数字图像处理领域,在计算摄影学中,用于拍摄所得图像的后期处理。
5.图像锐化
图像锐化也称边缘增强。锐化技术用于加强图像中的边界和细节信息。由于边界和细节信息对应频域中的高频部分,所以在频域中通常对图像进行高通滤波,在空间域则进行微分处理。为增加细节信息,采用了拉普拉斯算子进行图像锐化。
Laplace算子
拉普拉斯(Laplace)是著名物理学家和数学家,laplace定义如下:
在这里插入图片描述
对于离散函数f(i,j),laplace算子定义为:
在这里插入图片描述

因为
在这里插入图片描述

同理可得:
在这里插入图片描述

由此可得Laplace算子矩阵为:
在这里插入图片描述
三、实验步骤(包括分析、代码和波形)
首先来看看这个实验的内容。利用人物正面照,参考例7.15实现皮肤美化处理,要求:
(1)滤波、色彩空间、代数运算、锐化等技术实现美化
(2)加入皮肤的亮白处理
(3)尝试其他肤色检测处理。
要求:实验报告一份,源程序一份,实验效果对比图;

实验的思路是很明确的,结合原理中的讨论,我们只要按照题目的要求依据参考代码、查看运行并进行验证就可以了,不需要计算。
下面是第(1)小题的代码。滤波、色彩空间、代数运算、锐化等技术实现美化;

clear,clc,close all;
ImageOrigin=im2double(imread('face.jpg'));
figure,imshow(ImageOrigin),title('原图');
DBImage=DBfilt(ImageOrigin);SkinImage1=FirstFilter(ImageOrigin);            %%初步过滤
SkinArea=SecondFilter(SkinImage1);           %%YCgCr空间范围肤色检测SkinFuse=Fuse(ImageOrigin,DBImage,SkinArea);
SkinBeautify=Sharp(SkinFuse);function Out=DBfilt(In)[height,width,c] = size(In); win=15;       % 定义双边滤波窗口宽度  sigma_s=6; sigma_r=0.1; % 双边滤波的两个标准差参数  [X,Y] = meshgrid(-win:win,-win:win); Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2));%计算邻域内的空间权值    Out=zeros(height,width,c); for k=1:cfor j=1:height    for i=1:width  temp=In(max(j-win,1):min(j+win,height),max(i-win,1):min(i+win,width),k);Gr = exp(-(temp-In(j,i,k)).^2/(2*sigma_r^2));%计算灰度邻近权值        % W为空间权值Gs和灰度权值Gr的乘积       W = Gr.*Gs((max(j-win,1):min(j+win,height))-j+win+1,(max(i-win,1):min(i+win,width))-i+win+1);      Out(j,i,k)=sum(W(:).*temp(:))/sum(W(:));            endend  endfigure,imshow(Out),title('双边滤波');
endfunction Out=FirstFilter(In)Out=In;[height,width,c] = size(In); IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3);for j=1:heightfor i=1:widthif (IR(j,i)<160/255 && IG(j,i)<160/255 && IB(j,i)<160) && (IR(j,i)>IG(j,i) && IG(j,i)>IB(j,i))Out(j,i,:)=0;endif IR(j,i)+IG(j,i)>500/255Out(j,i,:)=0;endif IR(j,i)<70/255 && IG(j,i)<40/255 && IB(j,i)<20/255Out(j,i,:)=0;endendendfigure,imshow(Out);title('非肤色初步过滤'); 
endfunction Out=SecondFilter(In)IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3);       [height,width,c] = size(In);Out=zeros(height,width);for i=1:widthfor j=1:height  R=IR(j,i); G=IG(j,i); B=IB(j,i);       Cg=(-81.085)*R+(112)*G+(-30.915)*B+128;  Cr=(112)*R+(-93.786)*G+(-18.214)*B+128;         if Cg>=85 && Cg<=135 && Cr>=-Cg+260 && Cr<=-Cg+280       Out(j,i)=1;          endendendOut=medfilt2(Out,[3 3]);figure,imshow(Out),title('YCgCr空间范围肤色检测');    
endfunction Out=Fuse(ImageOrigin,DBImage,SkinArea)Skin=zeros(size(ImageOrigin));Skin(:,:,1)=SkinArea;   Skin(:,:,2)=SkinArea;  Skin(:,:,3)=SkinArea;Out=DBImage.*Skin+double(ImageOrigin).*(1-Skin);figure,imshow(Out);title('肤色与背景图像融合');
end
function Out=Sharp(In)H=[0 -1 0;-1 4 -1;0 -1 0]; %Laplacian锐化模板Out(:,:,:)=imfilter(In(:,:,:),H); Out=Out/3+In;
%     imwrite(Out,'man4.jpg');figure,imshow(Out),title('Laplacia锐化图像');
end

下面是第(2)小题的代码。加入皮肤的亮白处理;

rgb = imread('face.jpg');%读取图片
figure(1),subplot(2,2,1);imshow(rgb);title('原图像');
[m,n,k] = size(rgb); %读取图片大小
hsv = rgb2hsv(rgb); %颜色空间转换
H = hsv(:,:,1); % 色调
S = hsv(:,:,2); % 饱和度
V = hsv(:,:,3); % 亮度
for i = 1:m %遍历每一个像素点,可以根据需要选择自己需要处理的区域for j = 1: nhsv(i,j,3) =1.3* hsv(i,j,3); %1.3是需要增强的倍数,可以根据图片情况动态调整end
endrgb1 = hsv2rgb(hsv); %转为RGB,进行显示
figure(1),subplot(2,2,2);imshow(rgb1);title('加亮图像');

下面是第(3)小题的代码。尝试其他肤色检测处理;

clear,clc,close all;
Image=imread('face.jpg');
figure,imshow(Image),title('原图');
r=double(Image(:,:,1));             % 提取红色分量并转化为高精度
g=double(Image(:,:,2));
b=double(Image(:,:,3));
[N,M]=size(r);                      % 提取矩阵r的大小 NxM
miu=[117.4361 156.5599]';           % 高斯肤色模型均值
sigma=[160.1301 12.1430;12.1430 299.4574];      % 高斯肤色模型协方差矩阵
cbcr=zeros(2,1);                    % 生成 2x1矩阵
SkinCbCrG=zeros(N,M);               % 生成所有值为0的 NxM矩阵用于存放处理后图像
SkinRGB=zeros(N,M);
SkinHSV=zeros(N,M);
SkinCbCr=zeros(N,M);
thresh=0.35;                        % 肤色概率二值化阙值
for i=1:M                           % 循环图像每一个像素点   列循环for j=1:N                       % 行循环R=r(j,i);                    % 将图像红色分量中(j,i)点值赋值给RG=g(j,i);B=b(j,i);if (R>95 && G>40 && B>20 && (R-G)>15 && R-B>15) || ...               % RGB空间肤色检测(R>220 && G>210 && B>170 && R-B<=15 && R>B && G>B)               % 符合RGB肤色检测条件的像素点值置1则为白色,其他不符合条件的像素点为0黑色SkinRGB(j,i)=1;endmaxRGB=max(max(R,G),B);       % 取三分量中同一点最大值minRGB=min(min(R,G),B);       % 取三分量中同一点最小值C=maxRGB-minRGB;              % 取最大差值V=maxRGB;                     % 最大值赋值给参数Vif V==0                       % 比较最大值是否等于零  S=0;elseS=C/V;                    % 最大值不等于零则 C最大差值/V最大值endif maxRGB==R                  % 如果该点最大值==红色分量值;作如下处理H=60*mod((G-B)/C,6);elseif maxRGB==G              % 如果该点最大值==绿色分量值;作如下处理H=60*((B-R)/C+2);elseif maxRGB==B              % 如果该点最大值==蓝色分量值;作如下处理H=60*((R-G)/C+4);end                           % 符合HSV肤色检测 将该点值置1if ((H>=0 && H<=25) || (H>=335 && H<=360)) && (S>=0.2 && S<=0.6) && V>=0.4SkinHSV(j,i)=1;          % 优化 HSV 效果增强?如何改?为什么这样改?endR=R/255;G=G/255;B=B/255;             % RGB 转 YCrCb 公式Cb=224*(-0.1687*R-0.3313*G+0.5*B)+128;Cr=224*(0.5*R-0.4187*G-0.0813*B)+128;if Cb>=77 && Cb<=127 && Cr>=133 && Cr<=173   % 符合 YCrCb肤色检测 将该点值置1SkinCbCr(j,i)=1;endcbcr= [Cb Cr]';                               % YCbCr空间基于高斯模型的肤色检测p=exp(-0.5*((cbcr-miu)')*(inv(sigma))*(cbcr-miu));   % 高斯模型函数if p>thresh                                    % p > 阙值0.35  值置1SkinCbCrG(j,i)=1;endend
end
figure,imshow(SkinRGB),title('RGB空间肤色检测');
figure,imshow(SkinHSV),title('HSV空间肤色检测');
figure,imshow(SkinCbCr),title('YCbCr空间范围肤色检测');
figure,imshow(SkinCbCrG),title('YCbCr空间高斯模型肤色检测');
imwrite(SkinRGB,'skinrgb3.jpg');
imwrite(SkinHSV,'skinhsv3.jpg');
imwrite(SkinCbCr,'skincbcr3.jpg');
imwrite(SkinCbCrG,'skinCbCrG3.jpg');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.原 型

7.1原型 【例如】 另外- this指向&#xff1a; 构造函数和原型对象中的this都指向实例化的对象 7.2 constructor属性 每个原型对象里面都有个constructor属性( constructor构造函数) 作用&#xff1a;该属性指向该原型对象的构造函数 使用场景: 如果有多个对象的方法&#…

Springboot 实践(4)swagger-ui 测试controller

前文项目操作&#xff0c;完成了项目的创建、数据源的配置以及数据库DAO程序的生成与配置。此文讲解利用swagger-ui界面&#xff0c;测试生成的数据库DAO程序。目前&#xff0c;项目swagger-ui界面如下&#xff1a; 以”用户管理”为例&#xff0c;简单讲述swagger-ui测试数据库…

无涯教程-Perl - s函数

描述 这不是功能。这是正则表达式替换运算符。根据PATTERN中指定的正则表达式,将数据替换为REPLACE。与m //一样,分隔符由s后的第一个字符定义。 语法 以下是此函数的简单语法- s/PATTERN/REPLACE/返回值 如果失败,此函数返回0,如果成功,则返回替换次数。 例 以下是显示…

【Python机器学习】实验10 支持向量机

文章目录 支持向量机实例1 线性可分的支持向量机1.1 数据读取1.2 准备训练数据1.3 实例化线性支持向量机1.4 可视化分析 实例2 核支持向量机2.1 读取数据集2.2 定义高斯核函数2.3 创建非线性的支持向量机2.4 可视化样本类别 实例3 如何选择最优的C和gamma3.1 读取数据3.2 利用数…

Open3D 最小二乘拟合平面(SVD分解法)

目录 一、算法原理二、代码实现三、结果展示1、点云2、拟合结果四、优秀博客本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 本文实现矩阵奇异值分解方法的最小二乘拟合平面。原理如下: 对于得到的 n n

欧拉函数(质因子分解)

思路&#xff1a; (1)欧拉函数&#xff1a;输入n则输出1~n中与n互质的数的个数。 &#xff08;2&#xff09;计算公式&#xff1a; &#xff08;3&#xff09;证明&#xff1a;&#xff08;容斥原理&#xff09;对于n个数&#xff0c;先分别摘除所有被pi整除的数&#xff0c;…

亿信ABI有什么不同,来看最新DEMO演示

为了给用户营造更好的体验环境&#xff0c;提供更丰富、更完善的服务&#xff0c;亿信华辰旗下核心产品亿信ABI DEMO再次上新啦&#xff01;本次亿信ABI DEMO环境在原有基础上焕新升级&#xff0c;带来了全新的主视觉界面、丰富的行业应用和功能演示DEMO&#xff0c;我们一起来…

季度到季度的组件选择

组件&#xff1a;<template><div class"quarter"><div class"input-wrap" id"closeId" mouseover"handler" click.stop"btn" :style"{color:colorItem}"><i class"el-icon-date"&…

【Java】BF算法(串模式匹配算法)

☀️ 什么是BF算法 BF算法&#xff0c;即暴力算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个与模式串T的第一个字符串进行匹配&#xff0c;若相等&#xff0c;则继续比较S的第二个字符和T的第二个字符&#xff1b;若不相等&#xff0c;则…

【计算机视觉|生成对抗】用深度卷积生成对抗网络进行无监督表示学习(DCGAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 链接&#xff1a;[1511.06434] Unsupervised Representation Learning with Deep Conv…

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

NLP——操作步骤讲义与实践链接

数据集与语料 语料是NLP的生命之源&#xff0c;所有NLP问题都是从语料中学到数据分布的规律语料的分类&#xff1a;单语料&#xff0c;平行语料&#xff0c;复杂结构 语料的例子&#xff1a;Penn Treebank, Daily Dialog, WMT-1x翻译数据集&#xff0c;中文闲聊数据集&#xf…

大数据:Numpy基础应用详解

Numpy基础应用 Numpy 是一个开源的 Python 科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作&#xff0c;对于同样的数值计算任务&#xff0c;使用 NumPy 不仅代码要简洁的多&#xff0c;而且 NumPy 的性能远远优于原生 Python&#xff0c;…

mysql-5.5.62-win32安装与使用

1.为啥是这个版本而不是当前最新的8.0&#xff1f; 因为我要用32位。目前mysql支持win32的版本最新只到5.7.33。 首先&#xff0c;到官网MySQL :: MySQL Downloads 然后选 选一个自己喜欢的版本就好。我这里是如标题版本。下载32位的zip。然后回来解压。 完了创建系统环境变…

项目实施方案案例模板-拿来即用

《项目实施方案》实际案例模板&#xff0c;拿来即用&#xff0c;原件可获取。 项目背景 项目目标 项目范围 项目总体计划 项目组织架构 5.1. 项目职责分工 项目风险点 6.1. 项目风险分析 6.2. 项目实施关键点 项目管理规范 7.1. 项目实施约束 7.2. 项目变更冻结 7…

(三) CUDA 硬件实现

一组带有on-chip 共享内存的SIMD多处理器 GPU可以被看作一组多处理器, 每个多处理器使用单一指令&#xff0c;多数据架构(SIMD)【单指令流多数据流】 在任何给定的时钟周期内&#xff0c;多处理器的每个处理器执行同一指令&#xff0c;但操作不同的数据 每个多处理器使用以下…

HASH索引,AVL树,B树,B+树的区别?

1. 什么是 Hash 1.1 Hash 函数 Hash 本身其实是一个函数&#xff0c;又被称为散列函数&#xff0c;它可以大幅提高我们对数据的检索效率。因为它是散列的&#xff0c;所以在存储数据的时候&#xff0c;它也是无序的。 Hash 算法是通过某种确定性的算法(例如MD5&#xff0c;S…

virtualBox桥接模式下openEuler镜像修改IP地址、openEule修改IP地址、openEule设置IP地址

安装好openEuler后,设置远程登入前,必不可少的一步,主机与虚拟机之间的通信要解决,下面给出详细步骤: 第一步:检查虚拟机适配器模式:桥接模式 第二步:登入虚拟机修改IP cd /etc/sysconfig/network-scripts vim ifcfg-enpgs3 没有vim的安装或者用vi代替:sudo dnf …

关于consul的下载方法

linux下 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install consulwindow下 https://developer.hashicorp.com/consul/downloads 然后把里面的exe文件放在gopath下就行了 验证…

打造专属花店展示小程序

在当今社会&#xff0c;微信小程序已经成为了各行各业拓展客户资源的利器&#xff0c;而花店行业也不例外。通过打造一个独特的花店小程序&#xff0c;你可以为你的花店带来更多的曝光和客户资源。那么&#xff0c;如何制作一个专属的花店小程序呢&#xff1f;下面我们就来一步…