数字图像处理实习报告_第1页
数字图像处理实习报告_第2页
数字图像处理实习报告_第3页
数字图像处理实习报告_第4页
数字图像处理实习报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、word数字图像处理 肤色检测学 院 电气信息工程专 业 电子信息工程班 级 信息11-2 姓 名 陈宾怡 学 号 02号 指导教师 董胜 一、设计思路 肤色检测原理是根据皮肤的固有色彩,在图像中选取相对应的颜色范围作为皮肤颜色。给定一幅包含人像的彩色图像,将其转换至其它表色系,利用肤色检测算法将皮肤区域以二值图像的形式检测出来并比照算法效果。在本次课程设计中,我们组确定将图像分别转换到HSV表色系和YCbCr表色系下,然后将不同表色系下的图像分别转换成相应的二值图,比照观察图像转换结果,以得到实验的实验结论。1HSV表色系下的肤色检测原理 HSV表色系包含三个属性:图像的色调(Hue),即表

2、示相应的颜色;饱和度(Saturation),即表示颜色的纯度;亮度(Value),即颜色的亮暗程度。所以该表色系是分别对图像的色调,饱和度和亮度进行描述的,根据皮肤的固有色调可以提取出皮肤区域。 图像从Rgb表色系转换到hsv表色系固定公式如下: 2YCbCr表色系下的肤色检测YCbCr颜色空间将色彩表示为三个分景。即亮度Y,蓝色色度Cb和红色色度Cr。YCbCr表色系中将亮度信息与色彩信息分开,充分考虑了RGB三个分量在视觉感觉中的不同重要性而确定的。图像从Rgb表色系转换到YCrCb表色系的转换公式为: 二、程序流程 1HSV表色系下二值图转换流程该点值为0 开始 初始化 读取图像并进行

3、数值格式转换 提取R,G,B通道建立与原图大小相同的矩阵利用公式将原图转换到HSV表色系下将HSV表色系下列图像确定皮肤RGB的取值范围依次判断图像各点RGB是否在皮肤范围内该点值为1 结 束 N Y 2YCbCr表色系下二值图转换流程该点值为0 开始 初始化 读取图像并进行数值格式转换 提取R,G,B通道建立与原图大小相同的矩阵利用公式将原图转换到YCbCr表色系下将YCbCr表色系下列图像确定皮肤RGB的取值范围判断图像各点RGB是否在皮肤范围内该点值为1 结 束NY三、设计中的难点及解决方案1、该设计方案思路整体比拟简单明确,设计过程中出现的问题主要集中在数据格式之间的转换问题,以及位图

4、图像的显示范围之间的问题1在将原图转换成HSV表色系下的图像时,开始时候无法得到准确的HSV图像。在将原图像的unit8数据类型转换为im2double型,在H通道转换完成后的值除以360,保证了HSV图像的正确显示以及准确的RGB数据提取,进而得到正确的二值图像。2在将原图转换成YCbCr表色系下的图像时,以double型读取图像,相应的通道转换完成时将三个通道的值除以256,保证显示范围在0,1之间,得到正确的YCbCr表色系下的图像,然后才提取相应皮肤的RGB 的范围,完成二值图像的转换。4、 程序清单如下1.主程序:void CDipDoc:OnColorSkin() / TODO:

5、Add your command handler code here/获取应用程序类指针CDipApp *pApp = GetApp();/获取主框架窗口指针CMainFrame *pFrame = GetMainFrame();CDibObject *Skin = new CDibObject(*m_pDibObject);/创立Color类对象CColor color(Skin);/ 更改光标形状BeginWaitCursor();if (color.DetectSkin(Skin)POSITION posTemplate = pApp->GetFirstDocTemplatePos

6、ition();CDocTemplate*pDocTemplate=pApp->GetNextDocTemplate(posTemplate);CDipDoc*pDocument=(CDipDoc*)pDocTemplate->OpenDocumentFile(NULL);pDocument->m_pDibObject = Skin;pDocument->m_bImageLoaded = TRUE;pDocument->SetTitle("肤色检测后的图象");/获取子框架窗口指针CChildFrame *pChild = (CChildFra

7、me *) pFrame->MDIGetActive();pChild->m_nWidth = m_pDibObject->GetWidth(); pChild->m_nHeight = m_pDibObject->GetHeight();pChild->SetWindowPos( NULL, 0, 0, pChild->m_nWidth + 12, pChild->m_nHeight + 38, SWP_NOZORDER | SWP_NOMOVE );pDocument->UpdateAllViews(NULL);elseAfxMessa

8、geBox("肤色检测产生错误!");/ 恢复光标EndWaitCursor();void CDipDoc:OnUpdateColorRedeye(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herevoid CDipDoc:OnUpdateColorSkin(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here2.检测图象中的肤色局部BOOL CColor:DetectSkin(CDibObject *pD

9、ibObject)/使用传入的CDibObject对象if( pDibObject != NULL ) m_pDibObject = pDibObject;/无CDibObject对象, 返回FALSEif( m_pDibObject = NULL ) return( FALSE );/获得图像宽度和高度int nWidth = m_pDibObject->GetWidth();int nHeight = m_pDibObject->GetHeight();/定义变量unsigned char *pOldBuffer; unsigned char *pOldBits;unsigne

10、d char *pTemp;BITMAPFILEHEADER *pOldBFH;BITMAPINFOHEADER *pOldBIH;RGBQUAD *pOldPalette;int nWidthBytes, nNumColors, x, y;/原图像指针pOldBuffer=(unsignedchar*) m_pDibObject->GetDIBPointer( &nWidthBytes, m_pDibObject->GetNumBits() );if( pOldBuffer = NULL ) return( FALSE );/原图像文件头指针pOldBFH = (BITM

11、APFILEHEADER *) pOldBuffer;/原图像信息头指针pOldBIH=(BITMAPINFOHEADER*) &pOldBuffersizeof(BITMAPFILEHEADER);/原图像颜色数nNumColors = m_pDibObject->GetNumColors();/原图像调色板指针pOldPalette = (RGBQUAD *) &pOldBuffersizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);/原图像数据指针pOldBits = (unsigned char *) &pO

12、ldBuffersizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD);RGBQUAD YCbCr;switch(m_pDibObject->GetNumBits() )case 8:/256彩色图像for( y = 0; y < nHeight; y+ )pTemp = pOldBits;/位图数据起始指针pTemp += y * nWidthBytes;/位图数据下一行起始指针for( x = 0; x < nWidth; x+ ) /把RGB转换到YCbCr空间中YCbCr

13、 = RGBtoYCbCr(pOldPalettepTempx);/判断当前点是否满足红眼条件if(!IsSkinPix(YCbCr)pTempx = 255;break;case 24:/24位真彩色图像for( y=0; y<nHeight; y+ )/位图数据起始指针pTemp = pOldBits;/位图数据下一行起始指针pTemp += y * nWidthBytes;for( x=0; x<nWidth; x+ )RGBQUAD rgb = pTempx * 3, pTempx * 3 + 1,pTempx * 3 + 2, 0;/把RGB转换到YCbCr空间中YCbC

14、r = RGBtoYCbCr(rgb);/判断当前点是否满足红眼条件if(!IsSkinPix(YCbCr)pTempx * 3 + 2 = 255;pTempx * 3 + 1 = 255;pTempx * 3 = 255;break;case 32:/32位真彩色图像for( y=0; y<nHeight; y+ )/位图数据起始指针pTemp = pOldBits;/位图数据下一行起始指针pTemp += y * nWidthBytes;for( x=0; x<nWidth; x+ )RGBQUAD rgb = pTempx * 4, pTempx * 4 + 1,pTemp

15、x * 4 + 2, pTempx * 4 + 3;/把RGB转换到YCbCr空间中YCbCr = RGBtoYCbCr(rgb);/判断当前点是否满足红眼条件if(!IsSkinPix(YCbCr)pTempx * 4 + 2 = 255;pTempx * 4 + 1 = 255;pTempx * 4 = 255;break;:GlobalUnlock( m_pDibObject->GetDib() );return( TRUE );3.判断该象素是否为肤色。BOOL CColor:IsSkinPix(RGBQUAD Skin) / Cr=142,166和Cb=100,124if( S

16、kin.rgbBlue >= 142 ) && ( Skin.rgbBlue <= 166 ) &&( Skin.rgbGreen >= 100 ) && ( Skin.rgbGreen <= 124 ) )return (TRUE);elsereturn (FALSE);4.YCbCr表色系下的二值图像转换程序:RGBQUAD CColor:RGBtoYCbCr(RGBQUAD lRGBColor)int Y,Cb,Cr,R,G,B;R = lRGBColor.rgbRed;G = lRGBColor.rgbGreen;

17、B = lRGBColor.rgbBlue;Y = (int)(0.299 * R + 0.587f * G + 0.114 * B);Cb = (int)(-0.1687 * R - 0.3313 * G + 0.5 * B) + 128;Cr = (int)(0.5 * R - 0.4187 * G - 0.0813 * B) + 128;/Y = min(255, max(0, Y);/Cb = min(255, max(0, Cb);/Cr = min(255, max(0, Cr);RGBQUAD xyz=(BYTE)Cr, (BYTE)Cb, (BYTE)Y, 0;return x

18、yz;5.检测图象中的红眼局部。BOOL CColor:DetectRedEye(CDibObject *pDibObject)/使用传入的CDibObject对象if( pDibObject != NULL ) m_pDibObject = pDibObject;/无CDibObject对象, 返回FALSEif( m_pDibObject = NULL ) return( FALSE );/获得图像宽度和高度int nWidth = m_pDibObject->GetWidth();int nHeight = m_pDibObject->GetHeight();/定义变量uns

19、igned char *pOldBuffer; unsigned char *pOldBits;unsigned char *pTemp;BITMAPFILEHEADER *pOldBFH;BITMAPINFOHEADER *pOldBIH;RGBQUAD *pOldPalette;int nWidthBytes, nNumColors, x, y;/原图像指针pOldBuffer=(unsignedchar*) m_pDibObject->GetDIBPointer( &nWidthBytes,m_pDibObject->GetNumBits() );if( pOldBu

20、ffer = NULL ) return( FALSE );/原图像文件头指针pOldBFH = (BITMAPFILEHEADER *) pOldBuffer;/原图像信息头指针pOldBIH=(BITMAPINFOHEADER*) &pOldBuffersizeof(BITMAPFILEHEADER);/原图像颜色数nNumColors = m_pDibObject->GetNumColors();/原图像调色板指针pOldPalette = (RGBQUAD *) &pOldBuffersizeof(BITMAPFILEHEADER)+sizeof(BITMAPIN

21、FOHEADER);/原图像数据指针pOldBits = (unsigned char *) &pOldBuffersizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD);double *HSI = new double3;switch(m_pDibObject->GetNumBits() )case 8:/256彩色图像for( y = 0; y < nHeight; y+ )pTemp = pOldBits;/位图数据起始指针pTemp += y * nWidthBytes

22、;/位图数据下一行起始指针for( x = 0; x < nWidth; x+ ) /把RGB转换到HSI空间中RGBtoHSI(HSI, pOldPalettepTempx);/判断当前点是否满足红眼条件if(IsRedEyePix(HSI)HSI1 = 0.0;RGBQUAD rgbNew = HSItoRGB(HSI);pOldPalettepTempx = rgbNew;break;case 24:/24位真彩色图像for( y=0; y<nHeight; y+ )/位图数据起始指针pTemp = pOldBits;/位图数据下一行起始指针pTemp += y * nWidthBytes;for( x=0; x<nWidth; x+ )RGBQUAD rgb = pTempx * 3, pTempx * 3 + 1,pTempx * 3 + 2, 0;RGBtoHSI(HSI, rgb);/判断当前点是否满足红眼条件if(IsRedEyePix(HSI)HSI1 = 0.0;RGBQUAD rgbNew = HSItoRGB(HSI)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论