论坛账号至少一个月登录一次,否则会被自动冻结!论坛全站广告位出租2160元一年,有需要联系QQ:3173974412。国内首家由论坛网友持股的IC技术论坛,IC人的乌托邦!
专业IC版图外包服务 手机号:13816911948 微信同号
广告位:SY02 广告业务联系QQ:3173974412
青软晶尊微电子---IC版图外包服务(13964228177)+教育培训(13573273505)
苏州拓光微电子---芯片设计整体解决方案供应商
以色列芯片设计公司提供超高ADC、DAC接口类定制IP,郑生18988685390(微信)
查看: 626|回复: 3
打印 上一主题 下一主题

[资料] 头像无痕组合技术实现的数字图像处理课程设计

[复制链接]
跳转到指定楼层
楼主
发表于 2019-2-9 19:49:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
数字图像处理课程设计报告
? ?题目:头像无痕组合技术实现

摘 要

? ?图像信息是人类获取信息的重要来源及利用信息的重要手段,图像处理科学技术是科学研究、社会生产及人类生活中不可缺少的强有力工具。在信息社会中,数字图像处理科学在理论或实践上都存在着巨大的潜力。??数字图像处理是一种通过计算机采用一定的算法对图形图像进行处理的技术。数字图像处理技术已经在各个领域上都有了比较广泛的应用。图像处理的信息量很大,对处理速度的要求也比较高。MATLAB强大的运算和图形展示功能,使图像处理变得更加的简单和直观。
? ?图像合成又称图像融合,就是将一幅图像中的目标提取出来与另一幅图像融合成为一幅新的图像。图像合成在军事,医学,艺术,生活等很多领域都有着广泛的应用。
? ?本文讨论人脸部位元素和人脸图像的合成,并应用MATLAB软件编程实现。针对该问题分成以下三步。
第一步,目标提取。通过对元素图像进行锐化,二值化,边缘检测处理,提取出所需人脸部位元素;第二步,图像合成。找出人脸元素指定位置坐标,将截取元素融合入人脸中;第三步,图像修复。对融合元素采用两种图像像素加权的方法进行修复,使图像更自然,达到头像无痕组合技术实现

目录

第1部分目标提取

1.1脸部元素与背景的分离

1.2脸部元素的处理

??1.2.1合理腐蚀法

??1.2.2二值化边界判别法

第2部分图像合成

2.1确定坐标

2.2放置脸部元素

第3部分图像修复

3.1问题分析

3.2边缘加权法

??3.2.1方法思路

??3.2.2具体过程

3.3灰度阈值加权法

第4部分总结
? ?? ? 参考文献资料
第5部分附录

一、目标提取
1.1脸部元素与背景的分离
图像边缘对图像识别和计算机分析十分有用,边缘能勾画出目标 物体,使观察者—目了然; 边缘蕴含了丰富的内在信息,是图像识别中重要的图像特征之一。从本质上说,图像边缘是图像局部特性不连续的反映,它标志着一个区域的终结和另一个区域的开始。它存在于目标 与背景、 目标与目标、区域与区域、基元与基元之间,因此它是图像分割所依赖的重要特征。
考虑目标图像中的对应脸部元素边界处过渡较明显,我们先将图像放大——为了减小检测边缘的锯齿影响,锐化——使图像的边缘更加明显,再将图像缩小以更好的得到目标元素的边缘轮廓。接着将图像二值化,并简单的滤波将无关紧要的杂质滤去,防止对边缘检测产生影响。为了找出最好的边缘检测方法,我们先后尝试了Robert算子,Sobel算子,Prewitt算子,拉普拉斯算子,以及Canny算子,最终得出Canny算子是效果最好的一种算法,所以我们最终采用Canny算子边缘检测,其具体算法如下:
该检测方法是寻找图像梯度的局部极大值,梯度是用高斯滤波器的导数计算的。该方法使用两个阈值来分别检测强边缘和弱边缘,而且仅当弱边缘与强边缘相连时,弱边缘才会包含在输出中。此方法不容易受噪声的干扰,能够检测到真正的弱边缘。因此,Canny算子在图像处理中应用越来越广泛。它依据图像边缘检测最优准则设计算法:
①用高斯滤波模板进行卷积以消除噪声;
②利用导数算子找到图像灰度沿着两个(x,y)方向的偏导数,并求出梯度的大小;
③利用②的结果计算出梯度的方向;
④知道边缘的方向,就可以把边缘的梯度方向大致分四种:0°、45°、90°、135°方向。通过梯度的方向,就可以找到这个像素梯度方向的邻接像素;
⑤遍历图像,若某个像素的灰度值与其梯度方向上前后两个像素的灰度值相比不是最大的,那么这个像素值为零,即不是边缘;
⑥使用累计直方图计算两个阈值,大于高阈值的一定是边缘,小于低阈值的一定不是边缘,介于之间的,看这个像素的邻接像素中有没有超过高阈值的边缘像素,如果有的话那么它就是边缘了,否则它就不是边缘。
Canny检测方法不容易受噪声干扰,能够检测到真正的弱边缘,原因是它使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,可以将弱边缘包含在输出图像中,但是与原始图像比较,所提取的边缘仍然存在不完整,且有不连贯的现象,因此将边缘检测后的图像

膨胀处理,用于将目标元素轮廓的扩充,接着对轮廓内部填充,得到与目标矩阵等大且元素所在位置像素值为1,其他位置像素值为0的模板矩阵。如下图1。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???

? ? 图1
之后将得到模板矩阵与目标矩阵相乘,便得到只剩下相应元素,其他为黑色的图像。如图2。

图2
1.2脸部元素的处理
由于图像是连续信号,对于提取的脸部元素图像,其边界点含有背景色成分。如果直接将它与人脸合成,会出现轮廓线、锯齿状等不自然的现象,所以在合成前有必要对元素部分进行处理,消除其边缘点含有的背景色成分。
1.2.1方案一:合理腐蚀法
? ?对得到的元素图像,进行适当腐蚀膨胀,得到边缘被抹除的脸部元素,至此该元素不含背景颜色。如图3。
图3


1.2.2方案二:二值化边界判别法
根据区分元素和背景的二值图像,可以确定边界点。对于该二值图像,
“0”对应背景点,“1”对应元素点。当值为“1”时,如果该点周围的8个点构成的邻域内含有“0”值点,则该点以及对应于原图像中的像素点就是边界点,否则为内点。
确定出边界点后,从该边界点的邻域中寻找出内点,用该点内的颜色替代该边界点的颜色。将所有边界点的颜色替换完毕,脸部元素的处理结束。如图4。
图4

二、图像合成
2.1确定坐标
用1与上面提取脸部元素的模板矩阵每一个像素点值相减,即使得原来元素所在位置像素点为0,背景为1的模板矩阵。根据脸部图像的矩阵的大小,先大概确定元素应该放置的位置坐标,然后利用刚才得到的模板矩阵与大概确定的位置同维度的矩阵卷积,以鼻子为例得到的结果如图5所示。

? ?? ?? ?? ?? ?? ?? ?? ???图5
模板为0的部分被去掉,为1的部分被保留,被去掉的地方就是等会儿要放的脸部元素,然后根据去掉的位置去调整坐标,使得元素安放的位置合理即可。
2.2放置脸部元素
将如图4所示提取得到的脸部元素矩阵在2.1中确定的脸部放置元素的位置坐标下与对应的脸部矩阵像素值相加,这样就可以把提取出来的脸部元素放置到脸部的相应位置,效果如图6所示:


? ?? ?? ?? ?? ?? ?? ?? ?? ? 图6

将脸部上的所有元素都进行这样的操作就可以基本实现头像的组合,但是从图6中我们可以明显的发现鼻子周围有白色的分界线,所以下一步要对这里进行修复处理。
三、图像修复
3.1问题分析:利用边缘检测技术可以很好地提取保留我们想要的脸部元素,但是由于所给的元素如嘴巴的颜色和脸部的颜色不一致,如果将提取出来的元素直接贴到脸部相应位置会出现明显的分界线,所以我们有必要建立一种算法使得元素和脸部的颜色有一个渐变的过程。
3.2方案一:边缘加权法
? ?3.2.1方法思路:所给元素的背景是白色的,在元素内部和背景之间也有一个渐变的过程,在这里我们可以利用这种渐变,提取边界的像素值,经过一定处理得到每个像素点对应的加权系数,将加权系数处理元素和脸部接触处,可以使得元素颜色向脸部颜色过渡。
? ? 3.2.2具体过程:首先读取一张脸部和一张元素的彩色图片,将彩色图片分解为RGB三个矩阵,再对彩色图片灰度化,然后利用现有函数graythresh自动确定二值化阈值thresh 并用函数im2bw对图像进行二值化。由于图像中可能存在噪声,不利于对元素的边缘检测,所以边缘检测前先进行低通滤波,这里选用高斯滤波。边缘检测的算子有很多种,比如Sobel、Prewitt和Canny算子等,可以说各具优点和缺点,在这里经过我们多次尝试对比这些算子最终选用了Canny算子检测边缘。边缘检测后用函数bwmorph
进行膨胀,这样有利于是边缘封闭起来,然后用函数bwfill对元素边缘内进行填充,到这里我们可以初步利用填充后的边缘范围去提取元素,但是提取出来的元素大小可能不是我们想要的,所以之后我们还有进行多次腐蚀、膨胀已达到我们想要的边缘范围。在本方法中,我们需要两种边缘范围,一种是完全包含元素并且有点白色背景的外部边缘,另一种是比元素范围稍小一点的内部边缘,可以通过腐蚀膨胀次数的不同来得到。将内、外部边缘分别去提取元素,然后将外部减去内部的像素点就可以得到元素向背景过渡的边界部分,为了让边缘更加规则平滑这里再次进行高斯滤波。我们知道元素过渡边界部分像素点的值从里向外是由小到变化的,白色部分的值接近255,将这些像素值全部除以255并将得到的数值变换到0~1之间,即像素除得的最小值对应0、最大值对应1,每一个像素点对应一个加权系数,为了表述方便我们把这个矩阵称记为K1。由于我们在内部要更多地保留元素的像素值,所以要用1减去这些值使它们在元素边界部分从内到外、由大到小的变化,将这时的加权系数矩阵记为K2。将K2与提取的元素外部进行卷积得到具有过渡性的元素边缘矩阵。回到我们用来保留元素内部的边缘范围,将它的值反相,并在脸部要安放元素的位置进行卷积运算,可以挖去那一部分。然后用我们提取出来元素内部进行填充,这时可以看到元素和脸部会有明显的色差,在先接触会有分界线。这时,我们用K1去和脸部对应位置进行卷积,相当于把脸部和元素衔接处去掉一层以用来过渡颜色,然后将刚才用K2与元素外部卷积得到的矩阵填充到这里去掉的一层的位置,这样可以很好的实现从元素颜色到脸部颜色的过渡。最终的成果图如下图所示:

图7
3.3方案二:灰度加权法
将得到的元素图像I灰度处理得到图像HI,设定一个合适的阈值a,将图像HI中所有超过a的像素值所在坐标提取出来,记为HI(i,j)。记原始脸部图像为F,添加元素后的脸部图像为FI,复原处理后的脸部图像为FFI, 建立加权模型如下:
设权值为c:
FFI(i,j,1)=FI(i,j,1)*(1-c)+F(i,j,1)*c
FFI(i,j,2)=FI(i,j,2)*(1-c)+F(i,j,2)*c
FFI(i,j,3)=FI(i,j,3)*(1-c)+F(i,j,3)*c
分析知:灰度元素图像HI边缘过渡处,随着向外的扩张越大,矩阵的像素值也越大,表现在图像I中即为越趋于白色。故,建立权值c的关系式如下:
c=(FI(i,j,:)-K)/255? ?? ?? ?? ?(K值根据部位不同可做适当调整)
这样便得到随着图像颜色的变浅,权值c越大,原始脸部颜色的比例就越大,缓冲了颜色的严重过渡,使图像显示更加自然。如图1。
图1
四、总结
??在信息化时代,图像处理是必不可少的,本文讨论的是人脸部位图像和人脸图像的合成。这种技术多用于照片合成,把图像中的一部分转移到另一张图像上,我们可以想到的是影视上面的特效。
本文主要应用了数字图像处理的图像融合,在提取人脸部位的时候主要采取了锐化,二值化,边缘检测,腐蚀,膨胀。图像融合的时候应用的更多的是基础的坐标定位和镶嵌。最后是对融合图像的人脸部位的背景残余消除,主要是两种像素加权的办法。正是这些图像处理技术的共同作用,使我们小组完成了这次课程设计。
? ?
? ?通过几天的课程设计,让我们明确了分工合作的方法,也让我更多的学习到了MATLAB在图像处理上的应用,在这次课程设计中,我们查阅了许多资料,这些资料补足了我们在各方面的欠缺,同时提高了我们的图像处理知识。


附录:
  1. clear
  2. clc
  3. close all
  4. I1=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\鹰钩鼻3.bmp');
  5. I2=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\圆脸.bmp');
  6. I3=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\凸嘴.bmp');
  7. I4=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\小眼睛.bmp');
  8. I5=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\八字胡1.bmp');
  9. I6=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\时尚发.bmp');
  10. I7=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\1.bmp');
  11. I8=imread('G:\数字图像处理\2016课程设计\35头像无痕组合技术实现\短眉毛3.bmp');
  12. figure,imshow(I1)
  13. I22=I2;
  14. [M,N,P]=size(I1);
  15. I1=(I1)/2;
  16. figure,imshow(I1)??
  17. I11=I1;
  18. I3=(I3)/2;
  19. I33=I3;
  20. I4=(I4)/2;
  21. I44=I4;
  22. [m4,n4,p4]=size(I4);
  23. I5=(I5)/2;
  24. I55=I5;
  25. [m5,n5,p5]=size(I5);
  26. I6=(I6)/2;
  27. I66=imresize(I6,3);
  28. [m6,n6,p6]=size(I6);
  29. I7=(I7)/2;
  30. I77=imresize(I7,3);
  31. [m7,n7,p7]=size(I7);
  32. I8=(I8)/2;
  33. I88=I8;
  34. [m8,n8,p8]=size(I8);
  35. % ERI33=im2bw(imresize(I1,10),0.78);
  36. % ERI33 = medfilt2(ERI33,[3,3]);??%中值滤波
  37. % ERI33=bwmorph(ERI33,'dilate',1); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  38. % figure,imshow(ERI33)
  39. % BHI33 = bwfill((1-ERI33),'holes'); %将图像中所有的封闭轮廓填充
  40. % figure,imshow(BHI33)
  41. % BHI33=bwmorph(BHI33,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  42. % BHI33=bwmorph( BHI33,'erode',3); %将边缘检测后的图像腐蚀
  43. % BHI33=bwmorph(BHI33,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  44. % figure,imshow(BHI33)
  45. % BHI33=imresize(BHI33,0.1);
  46. % figure,imshow(BHI33)
  47. % I1(:,:,1)=double(I1(:,:,1)).*BHI33;
  48. % I1(:,:,2)=double(I1(:,:,2)).*BHI33;
  49. % I1(:,:,3)=double(I1(:,:,3)).*BHI33;
  50. % figure,imshow(I1)


  51. % for i=1:M
  52. %? ? for j=1:N
  53. %? ?? ? if I1(i,j,1)>245
  54. %? ?? ?? ???I1(i,j,1)=0;
  55. %? ?? ?? ???I1(i,j,2)=0;
  56. %? ?? ?? ???I1(i,j,3)=0;
  57. %? ?? ? end
  58. %? ? end
  59. % end
  60. % figure,imshow(I1)??
  61. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?脸部定位
  62. II2=rgb2gray(I2);
  63. II2=edge(II2,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  64. figure,imshow(II2)
  65. [m2,n2] = size (II2); %获得图像的大小

  66. BH=bwmorph(II2,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充,扩充次数随Mumd值变化
  67. figure,imshow(BH)??
  68. %title('对获得边缘的图像进行膨胀'); %保证卡片的轮廓完整

  69. BH = bwfill(BH,'holes'); %将图像中所有的封闭轮廓填充
  70. % BH=bwmorph(BH,'erode',Numd); %将边缘检测后的图像腐蚀
  71. BH = medfilt2(BH,[5,5]);??%中值滤波
  72. figure,imshow(BH);
  73. %title('膨胀后进行填充,再腐蚀和滤波'); %消除噪点影响
  74. A=sum(BH>0,2);
  75. A=A(1:(m2)*0.7);
  76. a=find(A==max(A));
  77. I2(a(1),(n2)/2,1)=255;
  78. I2(a(1),(n2)/2,2)=0;
  79. I2(a(1),(n2)/2,3)=0;
  80. figure,imshow(I2)
  81. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?? ?鼻子
  82. ERI1=im2bw(imresize(I1,10),0.44);
  83. ERI1= medfilt2(ERI1,[5,5]);??%中值滤波
  84. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  85. figure,imshow(ERI1)
  86. ERI1=bwmorph((1-ERI1),'dilate',5); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  87. figure,imshow(ERI1)
  88. BHI1= bwfill(ERI1,'holes'); %将图像中所有的封闭轮廓填充
  89. figure,imshow(BHI1)

  90. BHI1=bwmorph( BHI1,'erode',6); %将边缘检测后的图像腐蚀
  91. BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  92. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  93. BHI1=bwmorph( BHI1,'erode',3); %将边缘检测后的图像腐蚀

  94. figure,imshow(BHI1)
  95. BHI1=imresize(BHI1,0.1);
  96. BHI1=bwmorph( BHI1,'erode',2); %将边缘检测后的图像腐蚀
  97. BHI1=bwmorph(BHI1,'dilate',1); %将边缘检测后的图像膨胀
  98. BHI1=bwmorph( BHI1,'erode',3); %将边缘检测后的图像腐蚀
  99. figure,imshow(BHI1)
  100. I11(:,:,1)=double((I11(:,:,1))*2).*BHI1;
  101. I11(:,:,2)=double((I11(:,:,2))*2).*BHI1;
  102. I11(:,:,3)=double((I11(:,:,3))*2).*BHI1;
  103. figure,imshow(I11)

  104. HH1=1-BHI1;
  105. for i=188:284
  106. ? ?for j=143:239
  107. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH1(i-187,j-142);
  108. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH1(i-187,j-142);
  109. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH1(i-187,j-142);
  110. ? ?? ?I2(i,j,1)=I2(i,j,1)+I11(i-187,j-142,1);
  111. ? ?? ?I2(i,j,2)=I2(i,j,2)+I11(i-187,j-142,2);
  112. ? ?? ?I2(i,j,3)=I2(i,j,3)+I11(i-187,j-142,3);
  113. ? ?? ?rgbI2=rgb2gray(I2);
  114. ? ?? ?if rgbI2(i,j)>185
  115. ? ?? ?? ? HD=(rgbI2(i,j)-20)/255;
  116. ? ?? ?? ? I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
  117. ? ?? ?? ? I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
  118. ? ?? ?? ? I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
  119. ? ?? ?end
  120. ? ?end
  121. end
  122. figure,imshow(I2)
  123. H=(1/9)*ones(3,3);
  124. I2=imfilter(I2,H);

  125. figure,imshow(I2)

  126. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?? ?? ?? ?嘴
  127. ERI3=im2bw(imresize(I3,10),0.44);
  128. ERI3= medfilt2(ERI3,[5,5]);??%中值滤波
  129. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  130. figure,imshow(ERI3)
  131. ERI3=bwmorph((1-ERI3),'dilate',5); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  132. figure,imshow(ERI3)
  133. BHI3= bwfill(ERI3,'holes'); %将图像中所有的封闭轮廓填充
  134. figure,imshow(BHI3)

  135. BHI3=bwmorph( BHI3,'erode',6); %将边缘检测后的图像腐蚀
  136. BHI3=bwmorph(BHI3,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  137. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充

  138. figure,imshow(BHI3)
  139. BHI3=imresize(BHI3,0.1);
  140. BHI3=bwmorph( BHI3,'erode',2); %将边缘检测后的图像腐蚀
  141. BHI3=bwmorph(BHI3,'dilate',1); %将边缘检测后的图像膨胀
  142. BHI3=bwmorph( BHI3,'erode',1); %将边缘检测后的图像腐蚀
  143. figure,imshow(BHI3)
  144. I33(:,:,1)=double((I33(:,:,1))*2).*BHI3;
  145. I33(:,:,2)=double((I33(:,:,2))*2).*BHI3;
  146. I33(:,:,3)=double((I33(:,:,3))*2).*BHI3;
  147. figure,imshow(I33)

  148. HH3=1-BHI3;
  149. for i=251:347
  150. ? ?for j=143:239
  151. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH3(i-250,j-142);
  152. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH3(i-250,j-142);
  153. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH3(i-250,j-142);
  154. ? ?? ?I2(i,j,1)=I2(i,j,1)+I33(i-250,j-142,1);
  155. ? ?? ?I2(i,j,2)=I2(i,j,2)+I33(i-250,j-142,2);
  156. ? ?? ?I2(i,j,3)=I2(i,j,3)+I33(i-250,j-142,3);
  157. ? ?? ?rgbI2=rgb2gray(I2);
  158. ? ?? ?if rgbI2(i,j)>185
  159. ? ?? ?? ? HD=(rgbI2(i,j)-20)/255;
  160. ? ?? ?? ? I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
  161. ? ?? ?? ? I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
  162. ? ?? ?? ? I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
  163. ? ?? ?end
  164. ? ?end
  165. end
  166. figure,imshow(I2)
  167. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%************? ?? ?眼睛
  168. ERI4=im2bw(imresize(I4,10),0.44);
  169. ERI4= medfilt2(ERI4,[5,5]);??%中值滤波
  170. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  171. figure,imshow(ERI4)
  172. ERI4=bwmorph((1-ERI4),'dilate',5); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  173. figure,imshow(ERI4)
  174. BHI4= bwfill(ERI4,'holes'); %将图像中所有的封闭轮廓填充
  175. figure,imshow(BHI4)

  176. BHI4=bwmorph( BHI4,'erode',4); %将边缘检测后的图像腐蚀
  177. BHI4=bwmorph(BHI4,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  178. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充

  179. figure,imshow(BHI4)
  180. BHI4=imresize(BHI4,0.1);
  181. BHI4=bwmorph( BHI4,'erode',1); %将边缘检测后的图像腐蚀
  182. BHI4=bwmorph(BHI4,'dilate',2); %将边缘检测后的图像膨胀
  183. BHI4=bwmorph( BHI4,'erode',1); %将边缘检测后的图像腐蚀
  184. BHI4(:,(n4)/2:end)=bwmorph( BHI4(:,(n4)/2:end),'erode',4); %将边缘检测后的图像腐蚀
  185. figure,imshow(BHI4)
  186. I44(:,:,1)=double((I44(:,:,1))*2).*BHI4;
  187. I44(:,:,2)=double((I44(:,:,2))*2).*BHI4;
  188. I44(:,:,3)=double((I44(:,:,3))*2).*BHI4;
  189. figure,imshow(I44)

  190. HH4=1-BHI4;
  191. for i=178:221
  192. ? ?for j=113:269
  193. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH4(i-177,j-112);
  194. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH4(i-177,j-112);
  195. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH4(i-177,j-112);
  196. ? ?? ?I2(i,j,1)=I2(i,j,1)+I44(i-177,j-112,1);
  197. ? ?? ?I2(i,j,2)=I2(i,j,2)+I44(i-177,j-112,2);
  198. ? ?? ?I2(i,j,3)=I2(i,j,3)+I44(i-177,j-112,3);
  199. ? ?? ?rgbI2=rgb2gray(I2);
  200. ? ?? ?if rgbI2(i,j)>175
  201. ? ?? ?? ? HD=(rgbI2(i,j)-50)/255;
  202. ? ?? ?? ? I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
  203. ? ?? ?? ? I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
  204. ? ?? ?? ? I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
  205. ? ?? ?end
  206. ? ?end
  207. end
  208. figure,imshow(I2)
  209. I2(i,j,1)= medfilt2(I2(i,j,1),[5,5]);??%中值滤波
  210. I2(i,j,2)= medfilt2(I2(i,j,2),[5,5]);??%中值滤波
  211. I2(i,j,3)= medfilt2(I2(i,j,3),[5,5]);??%中值滤波

  212. figure,imshow(I2)
  213. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ? 胡子
  214. ERI5=im2bw(imresize(I5,10),0.44);
  215. ERI5= medfilt2(ERI5,[5,5]);??%中值滤波
  216. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  217. figure,imshow(ERI5)
  218. ERI5=bwmorph((1-ERI5),'dilate',5); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  219. figure,imshow(ERI5)
  220. BHI5= bwfill(ERI5,'holes'); %将图像中所有的封闭轮廓填充
  221. figure,imshow(BHI5)

  222. BHI5=bwmorph( BHI5,'erode',6); %将边缘检测后的图像腐蚀
  223. BHI5=bwmorph(BHI5,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  224. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充

  225. figure,imshow(BHI5)
  226. BHI5=imresize(BHI5,0.1);
  227. BHI5=bwmorph( BHI5,'erode',2); %将边缘检测后的图像腐蚀
  228. BHI5=bwmorph(BHI5,'dilate',1); %将边缘检测后的图像膨胀
  229. BHI5=bwmorph( BHI5,'erode',2); %将边缘检测后的图像腐蚀
  230. figure,imshow(BHI5)
  231. I55(:,:,1)=double((I55(:,:,1))*2).*BHI5;
  232. I55(:,:,2)=double((I55(:,:,2))*2).*BHI5;
  233. I55(:,:,3)=double((I55(:,:,3))*2).*BHI5;
  234. figure,imshow(I55)

  235. HH5=1-BHI5;
  236. for i=226:322
  237. ? ?for j=143:239
  238. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH5(i-225,j-142);
  239. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH5(i-225,j-142);
  240. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH5(i-225,j-142);
  241. ? ?? ?I2(i,j,1)=I2(i,j,1)+I55(i-225,j-142,1);
  242. ? ?? ?I2(i,j,2)=I2(i,j,2)+I55(i-225,j-142,2);
  243. ? ?? ?I2(i,j,3)=I2(i,j,3)+I55(i-225,j-142,3);
  244. ? ?? ?rgbI2=rgb2gray(I2);
  245. ? ?? ?if rgbI2(i,j)>200
  246. ? ?? ?? ? HD=(rgbI2(i,j)-50)/255;
  247. ? ?? ?? ? I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
  248. ? ?? ?? ? I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
  249. ? ?? ?? ? I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
  250. ? ?? ?end
  251. ? ?end
  252. end
  253. figure,imshow(I2)
  254. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?? ? 头发
  255. ERI6=im2bw(imresize(I6,30),0.44);
  256. ERI6= medfilt2(ERI6,[5,5]);??%中值滤波
  257. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  258. figure,imshow(ERI6)
  259. BHI6=bwmorph((1-ERI6),'dilate',1); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  260. figure,imshow(BHI6)
  261. %BHI6= bwfill(BHI6,'holes'); %将图像中所有的封闭轮廓填充
  262. %figure,imshow(BHI6)

  263. %BHI6=bwmorph( BHI6,'erode',6); %将边缘检测后的图像腐蚀
  264. BHI6=bwmorph(BHI6,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  265. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充

  266. %figure,imshow(BHI6)
  267. BHI6=imresize(BHI6,0.1);
  268. BHI6=bwmorph( BHI6,'erode',3); %将边缘检测后的图像腐蚀
  269. BHI6=bwmorph(BHI6,'dilate',1); %将边缘检测后的图像膨胀
  270. BHI6=bwmorph( BHI6,'erode',3); %将边缘检测后的图像腐蚀
  271. figure,imshow(BHI6)
  272. I66(:,:,1)=double((I66(:,:,1))*2).*BHI6;
  273. I66(:,:,2)=double((I66(:,:,2))*2).*BHI6;
  274. I66(:,:,3)=double((I66(:,:,3))*2).*BHI6;
  275. figure,imshow(I66)

  276. HH6=1-BHI6;
  277. for i=6:296
  278. ? ?for j=46:336
  279. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH6(i-5,j-45);
  280. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH6(i-5,j-45);
  281. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH6(i-5,j-45);
  282. ? ?? ?I2(i,j,1)=I2(i,j,1)+I66(i-5,j-45,1);
  283. ? ?? ?I2(i,j,2)=I2(i,j,2)+I66(i-5,j-45,2);
  284. ? ?? ?I2(i,j,3)=I2(i,j,3)+I66(i-5,j-45,3);
  285. ? ?? ?rgbI2=rgb2gray(I2);
  286. ? ?? ?if rgbI2(i,j)>175
  287. ? ?? ?? ? HD=(rgbI2(i,j)-20)/255;
  288. ? ?? ?? ? I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
  289. ? ?? ?? ? I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
  290. ? ?? ?? ? I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
  291. ? ?? ?end
  292. ? ?end
  293. end
  294. figure,imshow(I2)
  295. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?? ?帽子
  296. I5=I7;
  297. I55=I77;
  298. ERI5=im2bw(imresize(I5,35),0.44);
  299. Z=sum((1-ERI5),2);
  300. ZZ=find(Z~=0);
  301. ERI5=ERI5(ZZ(1):ZZ(end),:);

  302. ERI5= medfilt2(ERI5,[5,5]);??%中值滤波
  303. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  304. figure,imshow(ERI5)
  305. ERI5=bwmorph((1-ERI5),'dilate',5); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  306. figure,imshow(ERI5)
  307. BHI5= bwfill(ERI5,'holes'); %将图像中所有的封闭轮廓填充
  308. figure,imshow(BHI5)

  309. BHI5=bwmorph( BHI5,'erode',6); %将边缘检测后的图像腐蚀
  310. BHI5=bwmorph(BHI5,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  311. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充

  312. figure,imshow(BHI5)
  313. BHI5=imresize(BHI5,0.1);
  314. BHI5=bwmorph( BHI5,'erode',2); %将边缘检测后的图像腐蚀
  315. BHI5=bwmorph(BHI5,'dilate',1); %将边缘检测后的图像膨胀
  316. BHI5=bwmorph( BHI5,'erode',3); %将边缘检测后的图像腐蚀
  317. figure,imshow(BHI5)
  318. I55=imresize(I5,35);
  319. I55=I55(ZZ(1):ZZ(end),:,:);
  320. % I55(:,:,2)=I55(ZZ(1):ZZ(end),:,2);
  321. % I55(:,:,3)=I55(ZZ(1):ZZ(end),:,3);
  322. I55=imresize(I55,0.1);

  323. I55(:,:,1)=double((I55(:,:,1))*2).*BHI5;
  324. I55(:,:,2)=double((I55(:,:,2))*2).*BHI5;
  325. I55(:,:,3)=double((I55(:,:,3))*2).*BHI5;
  326. figure,imshow(I55)

  327. HH5=1-BHI5;
  328. for i=18:175
  329. ? ?for j=21:314
  330. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH5(i-17,j-20);
  331. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH5(i-17,j-20);
  332. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH5(i-17,j-20);
  333. ? ?? ?I2(i,j,1)=I2(i,j,1)+I55(i-17,j-20,1);
  334. ? ?? ?I2(i,j,2)=I2(i,j,2)+I55(i-17,j-20,1);
  335. ? ?? ?I2(i,j,3)=I2(i,j,3)+I55(i-17,j-20,1);
  336. ? ?end
  337. end
  338. figure,imshow(I2)
  339. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%? ?? ???眉毛
  340. ERI8=im2bw(imresize(I8,10),0.44);
  341. ERI8= medfilt2(ERI8,[5,5]);??%中值滤波
  342. %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子边缘检测
  343. figure,imshow(ERI8)
  344. ERI8=bwmorph((1-ERI8),'dilate',5); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  345. figure,imshow(ERI8)
  346. BHI8= bwfill(ERI8,'holes'); %将图像中所有的封闭轮廓填充
  347. figure,imshow(BHI8)

  348. BHI8=bwmorph( BHI8,'erode',6); %将边缘检测后的图像腐蚀
  349. BHI8=bwmorph(BHI8,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充
  350. % BHI1=bwmorph(BHI1,'dilate',3); %将边缘检测后的图像膨胀一次,用于将卡片轮廓的扩充

  351. figure,imshow(BHI8)
  352. BHI8=imresize(BHI8,0.1);
  353. BHI8=bwmorph( BHI8,'erode',3); %将边缘检测后的图像腐蚀
  354. BHI8=bwmorph(BHI8,'dilate',1); %将边缘检测后的图像膨胀
  355. BHI8=bwmorph( BHI8,'erode',3); %将边缘检测后的图像腐蚀
  356. %BHI8(:,(n8)/2:end)=bwmorph( BHI8(:,(n8)/2:end),'erode',4); %将边缘检测后的图像腐蚀
  357. figure,imshow(BHI8)
  358. I88(:,:,1)=double((I88(:,:,1))*2).*BHI8;
  359. I88(:,:,2)=double((I88(:,:,2))*2).*BHI8;
  360. I88(:,:,3)=double((I88(:,:,3))*2).*BHI8;
  361. figure,imshow(I88)

  362. HH8=1-BHI8;
  363. for i=158:201
  364. ? ?for j=113:269
  365. ? ?? ?I2(i,j,1)= double(I2(i,j,1)).*HH8(i-157,j-112);
  366. ? ?? ?I2(i,j,2)= double(I2(i,j,2)).*HH8(i-157,j-112);
  367. ? ?? ?I2(i,j,3)= double(I2(i,j,3)).*HH8(i-157,j-112);
  368. ? ?? ?I2(i,j,1)=I2(i,j,1)+I88(i-157,j-112,1);
  369. ? ?? ?I2(i,j,2)=I2(i,j,2)+I88(i-157,j-112,2);
  370. ? ?? ?I2(i,j,3)=I2(i,j,3)+I88(i-157,j-112,3);
  371. ? ?? ?rgbI2=rgb2gray(I2);

  372. ? ?? ?if rgbI2(i,j)>165
  373. ? ?? ?? ? HD=(rgbI2(i,j)-30)/255;
  374. ? ?? ?? ? I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
  375. ? ?? ?? ? I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
  376. ? ?? ?? ? I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
  377. ? ?? ?end
  378. ? ?end
  379. end
  380. figure,imshow(I2)
  381. I2(i,j,1)= medfilt2(I2(i,j,1),[5,5]);??%中值滤波
  382. I2(i,j,2)= medfilt2(I2(i,j,2),[5,5]);??%中值滤波
  383. I2(i,j,3)= medfilt2(I2(i,j,3),[5,5]);??%中值滤波

  384. figure,imshow(I2)
复制代码


头像无痕组合技术实现.doc

227 KB, 下载次数: 0, 下载积分: IC币 -2 元

沙发
发表于 2019-3-6 15:43:15 | 只看该作者


Thank you for sharing
板凳
发表于 2019-5-8 22:39:54 | 只看该作者
我觉得python更容易实现
地板
发表于 2019-5-9 03:48:51 | 只看该作者
zzzzzzzzzzzzzzzzz
您需要登录后才可以回帖 登录 | 入住IC小镇

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|IC设计小镇 ( 苏ICP备10008526号 )???

GMT+8, 2019-8-31 05:50 , Processed in 0.082705 second(s), 9 queries , File On.

Powered by Discuz! X3.4

? 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表