MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、不同算子的图像锐化知识。希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生。
       【数字图像处理】一.MFC详解显示BMP格式图片
       【数字图像处理】二.MFC单文档分割窗口显示图片
       【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
       【数字图像处理】四.MFC对话框绘制灰度直方图
       【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
       【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
        免费资源下载地址:
        http://download.csdn.net/detail/eastmount/8785591

 

一. 图像增强简介

        图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)


 

 

二. 图像平滑

        图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。

       1.简单平滑-邻域平均法
        图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
        但邻域平均值主要缺点是在降低噪声的同时使图像变得模糊,特别在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。



        2.高斯平滑
        
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
        图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。
        在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器。
        高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的3*3和5*5领域的高斯模板。

        模板越靠近邻域中心位置,其权值越高。在图像细节进行模糊时,可以更多的保留图像总体的灰度分布特征。下图是常用的四个模板和matlab代码实现:

        代码如下:

 
  1. I1 = imread('blood1.tif');

  2. I=imnoise(I1,‘salt & pepper’,0.04); %对图像加椒盐噪声

  3. imshow(I);

  4. h1= [0.1 0.1 0.1; 0.1 0.2 0.1; 0.1 0.1 0.1]; %定义4种模板

  5. h2=1/16.*[1 2 1;2 4 2;1 2 1];

  6. h3=1/8.*[1 1 1;1 0 1;1 1 1];

  7. h4=1/2.*[0 1/4 0;1/4 1 1/4;0 1/4 0];

  8. I2=filter2(h1,I); %用4种模板进行滤波处理

  9. I3=filter2(h2,I);

  10. I4=filter2(h3,I);

  11. I5=filter2(h4,I);

  12. figure,imshow(I2,[]) %显示处理结果

  13. figure,imshow(I3,[])

  14. figure,imshow(I4,[])

  15. figure,imshow(I5,[])

        运行效果如下图所示:


        3.中值滤波
        在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。
        选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。

        例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:

        常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适合外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。

        中值滤波对于消除孤立点和线段的干扰十分有用,尤其是对于二进噪声,但对消除高斯噪声的影响效果不佳。对于一些细节较多的复杂图像,可以多次使用不同的中值滤波。matlab实现参考:http://blog.csdn.net/timidsmile/article/details/6904381

        4.边界保持类滤波
        K近邻均值滤波器(KNNF)是指在m*m的窗口中,属于同一集合类的像素,它们的灰度值将高度相关。被处理的像素(对应于窗口中心的像素)可以用窗口内与中心像素灰度最接近的k个近邻像素的平均灰度来替代。步骤如下:
        (1).作一个m*m的作用模板
        (2).在其中选择K个与待处理像素的灰度差为最小的像素
        (3).用这K个像素的灰度均值替换掉原来的值

        在K近旁均值滤波器(KNNMF)中,不选K个邻近像素的平均灰度来替代,而选K个邻近像素的中值灰度来替代,上图中2,3,3中选择3即可。
        下面介绍具体MFC VC++6.0代码实现过程。


 

三. 图像平滑代码实现

        第一步:在资源视图的Menu中添加子菜单“图像增强”,然后添加“图像平滑”四个选项如下图所示:

        第二步:打开类向导,在ImageProcessingView类中添加相应的四个实现函数:

        第三步:就是具体的平滑实现函数。
        1.普通平滑 模板一
        该算法采用的模板如下:

        代码如下:

 
  1. /**************************************************

  2. 第九章--图像增强

  3. 图像平滑 普通平滑 模板

  4.  
  5. float H1[3][3]={{1.0/10,1.0/10,1.0/10}, //模板一:系数1/10

  6. {1.0/10,2.0/10,1.0/10},

  7. {1.0/10,1.0/10,1.0/10}};

  8.  
  9. float H2[3][3]={{1.0/16,2.0/16,1.0/16}, //模板二:系数1/16

  10. {2.0/16,4.0/16,2.0/16},

  11. {1.0/16,2.0/16,1.0/16}};

  12.  
  13. float H3[3][3]={{1.0/8,1.0/8,1.0/8}, //模板三:系数1/8,此种情况为把点转为空心矩形

  14. {1.0/8,0.0/8,1.0/8},

  15. {1.0/8,1.0/8,1.0/8}};

  16.  
  17. float H4[3][3]={{0.0,1.0/8,0.0}, //模板四:系数乘数据后的矩阵

  18. {1.0/8,1.0/2,1.0/8},

  19. {0.0,1.0/8,0.0}};

  20.  
  21. /**************************************************/

  22.  
  23.  
  24. void CImageProcessingView::OnTxzqPtph1()

  25. {

  26. if(numPicture==0) {

  27. AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);

  28. return;

  29. }

  30. AfxMessageBox("图像增强(平滑)!选取的模板为:普通平滑 模板一",MB_OK,0);

  31.  
  32. /******************************************************************/

  33. /* 图想平滑的算法:

  34. /* 1.定义常用的四个模板,它们的维数均为3,矩阵的个数均为9个数据

  35. /* 2.它的思想是把一个点分散到这周围的9个点上,这样使图像更模糊

  36. /* 3.通过卷积计算围绕该点的矩阵像素和,计算其平均值(除9)赋值给点

  37. /* 4.模块不同,处理后的图像也各不相同

  38. /******************************************************************/

  39.  
  40. /*第一步:先定义数据模板*/

  41. int HWS=3; //模板维数:此四个模板均为3维的

  42. float H1[3][3]={{1.0/10,1.0/10,1.0/10}, //模板一:系数1/10

  43. {1.0/10,2.0/10,1.0/10},

  44. {1.0/10,1.0/10,1.0/10}};

  45.  
  46. //打开临时的图片

  47. FILE *fpo = fopen(BmpName,"rb");

  48. FILE *fpw = fopen(BmpNameLin,"wb+");

  49. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  50. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  51. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  52. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  53. fread(m_pImage,m_nImage,1,fpo);

  54.  
  55. //new和delete有效的进行动态内存的分配和释放

  56. unsigned char *ImageSize;

  57. ImageSize = new unsigned char[m_nImage];

  58. float red,green,blue;

  59. int X,Y; //一维坐标转换为二维坐标

  60. int TR,TG,TB; //记录红绿蓝坐标位置

  61.  
  62. //图像增强:平滑 它要获取源图像周围9个点的矩阵乘以模板9个点的矩阵,故一维图像转二维

  63. for(int i=0; i<m_nImage ; i=i+3 )

  64. {

  65. //原图:一维矩阵转换为二维矩阵

  66. X=(i/3)%m_nWidth; //图像在X列

  67. Y=(i/3)/m_nWidth; //图像在Y行

  68.  
  69. //赋值为黑色,相当于清零

  70. red=green=blue=0;

  71.  
  72. //对图像进行像素求和并取平均值 HWS维数

  73. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  74. {

  75. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  76. {

  77. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight ) //防止越界

  78. {

  79. //模板一 进行模板平均,把该点像素分散到四周

  80. TR=j*m_nWidth*3+k*3;

  81. red+=H1[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);

  82. TG=j*m_nWidth*3+k*3+1;

  83. green+=H1[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);

  84. TB=j*m_nWidth*3+k*3+2;

  85. blue+=H1[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);

  86. }

  87. }

  88. }

  89. //对新图像赋值

  90. ImageSize[i]=(unsigned char)(red);

  91. ImageSize[i+1]=(unsigned char)(green);

  92. ImageSize[i+2]=(unsigned char)(blue);

  93. }

  94.  
  95. fwrite(ImageSize,m_nImage,1,fpw);

  96. fclose(fpo);

  97. fclose(fpw);

  98. numPicture = 2;

  99. level=400;

  100. Invalidate();

  101. }

        运行效果如图所示,图像平滑模糊了,但效果不是很好。

        其中实现的具体原理如下:
        首先将图像像素矩阵转换为(X,Y)的二维矩阵进行操作,同时获取(X,Y)坐标为中心的3*3矩阵,再通过它与3*3模板进行像素平均操作,就是两个3*3矩阵互乘。需要注意的是矩阵一个格子是RGB三字节(24位BMP),同时获取该中心点位置时,通过两层循环for(k=n-1;k<=n+1;k++)实现获取矩阵中九个点的像素。最后对该点(X,Y)的RGB进行赋值操作即可。



       2.普通平滑 模板二
        该算法采用的模板如下:

        代码如下:

 
  1. void CImageProcessingView::OnTxzqPtph2()

  2. {

  3. if(numPicture==0) {

  4. AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);

  5. return;

  6. }

  7. AfxMessageBox("图像增强(平滑)!选取的模板为:普通平滑 模板二",MB_OK,0);

  8.  
  9. /*第一步:先定义数据模板*/

  10. int HWS=3;

  11. float H2[3][3]={{1.0/8,1.0/8,1.0/8}, //模板三:系数1/8 此种情况为把点转为空心矩形

  12. {1.0/8,0.0/8,1.0/8},

  13. {1.0/8,1.0/8,1.0/8}};

  14.  
  15. //打开临时的图片

  16. FILE *fpo = fopen(BmpName,"rb");

  17. FILE *fpw = fopen(BmpNameLin,"wb+");

  18. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  19. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  20.  
  21. //重点:图像的每行像素都必须是4的倍数:1*1的图像为 r g b 00H

  22. int num; //记录每行多余的图像素数个数

  23. int sfSize; //补齐后的图像大小

  24. if(m_nWidth*3%4!=0) {

  25. num=(4-m_nWidth*3%4);

  26. sfSize=(m_nWidth*3+num)*m_nHeight; //每行多number个

  27. }

  28. else {

  29. num=0;

  30. sfSize=m_nWidth*m_nHeight*3;

  31. }

  32.  
  33. /*更改文件头信息 定义临时文件头结构变量*/

  34. BITMAPFILEHEADER bfhsf;

  35. BITMAPINFOHEADER bihsf;

  36. bfhsf=bfh;

  37. bihsf=bih;

  38. bfhsf.bfSize=sfSize+54;

  39. fwrite(&bfhsf,sizeof(BITMAPFILEHEADER),1,fpw);

  40. fwrite(&bihsf,sizeof(BITMAPINFOHEADER),1,fpw);

  41. fread(m_pImage,m_nImage,1,fpo);

  42.  
  43. //new和delete有效的进行动态内存的分配和释放

  44. unsigned char *ImageSize;

  45. ImageSize = new unsigned char[sfSize];

  46. float red,green,blue;

  47. int X,Y; //一维坐标转换为二维坐标

  48. int TR,TG,TB; //记录红绿蓝坐标位置

  49. int countWidth=0; //记录每行的像素个数,满行时变回0

  50. int place=0; //建立临时坐标 记录起始坐标(0,0)平移过来的位置

  51.  
  52. //图像增强 平滑

  53. for(int i=0; i<m_nImage; )

  54. {

  55. //原图一维矩阵转换为二维矩阵

  56. X=(i/3)%m_nWidth; //图像在X列

  57. Y=(i/3)/m_nWidth; //图像在Y行

  58.  
  59. //赋值为黑色,相当于清零

  60. red=green=blue=0;

  61.  
  62. //对图像进行像素求和并取平均值 HWS维数

  63. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  64. {

  65. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  66. {

  67. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight ) //防止越界

  68. {

  69. //模板二 进行模板平均,把该点像素分散到四周

  70. TR=j*m_nWidth*3+k*3;

  71. red+=H2[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);

  72. TG=j*m_nWidth*3+k*3+1;

  73. green+=H2[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);

  74. TB=j*m_nWidth*3+k*3+2;

  75. blue+=H2[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);

  76. }

  77. }

  78. }

  79. //对新图像赋值

  80. //通过变量place赋值变换后的图像 i始终指向原图3的倍数 为了补0而添加place变量

  81. ImageSize[place]=(unsigned char)(red);

  82. i++; place++;

  83. ImageSize[place]=(unsigned char)(green);

  84. i++; place++;

  85. ImageSize[place]=(unsigned char)(blue);

  86. i++; place++;

  87. countWidth=countWidth+3;

  88.  
  89. if(countWidth==m_nWidth*3)

  90. {

  91. if(num==0)

  92. {

  93. countWidth=0;

  94. place=Y*m_nWidth*3;

  95. }

  96. else //num为补0

  97. {

  98. for(int n=0;n<num;n++)

  99. {

  100. ImageSize[place]=0;

  101. place++;

  102. }

  103. countWidth=0;

  104. place=Y*(m_nWidth*3+num); //重点 添加Num

  105. }

  106. }

  107. }

  108.  
  109. fwrite(ImageSize,sfSize,1,fpw);

  110. fclose(fpo);

  111. fclose(fpw);

  112. numPicture=2;

  113. level=400;

  114. Invalidate();

  115. }

        你可能注意到了,在图像处理过程中,如果每行的字节数不是4的倍数,可能会出现斜线之类的处理BUG,所以需要手动补0筹齐4的倍数,代码中补0后运行效果如下图所示,我也一直没找到原因,可能是思想和深度还没有达到,以后有机会在解决吧!同时后面的算法都不准备再进行补0处理,主要讲述算法的思想!


         3.高斯平滑
         采用的模板如下:

        代码如下图所示:

 
  1. //高斯平滑

  2. void CImageProcessingView::OnTxzqGsph()

  3. {

  4. if(numPicture==0) {

  5. AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);

  6. return;

  7. }

  8. AfxMessageBox("图像增强(平滑)!选取的模板为:高斯平滑",MB_OK,0);

  9.  
  10. /*第一步:先定义数据模板*/

  11. int HWS=3; //模板维数为3维

  12. float H[3][3]={{1.0/16,2.0/16,1.0/16}, //高斯模板 系数1/16

  13. {2.0/16,4.0/16,2.0/16},

  14. {1.0/16,2.0/16,1.0/16}};

  15.  
  16. //打开临时的图片

  17. FILE *fpo = fopen(BmpName,"rb");

  18. FILE *fpw = fopen(BmpNameLin,"wb+");

  19. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  20. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  21. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  22. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  23. fread(m_pImage,m_nImage,1,fpo);

  24.  
  25. //new和delete有效的进行动态内存的分配和释放

  26. unsigned char *ImageSize;

  27. ImageSize = new unsigned char[m_nImage];

  28. float red,green,blue;

  29. int X,Y; //一维坐标转换为二维坐标

  30. int TR,TG,TB; //记录红绿蓝坐标位置

  31.  
  32. //图像增强:平滑

  33. for(int i=0; i<m_nImage ; i=i+3 )

  34. {

  35. //原图:一维矩阵转换为二维矩阵

  36. X=(i/3)%m_nWidth; //图像在X列

  37. Y=(i/3)/m_nWidth; //图像在Y行

  38.  
  39. //赋值为黑色,相当于清零

  40. red=green=blue=0;

  41.  
  42. //对图像进行像素求和并取平均值 HWS维数

  43. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  44. {

  45. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  46. {

  47. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight ) //防止越界

  48. {

  49. //模板二 进行模板平均,把该点像素分散到四周

  50. TR=j*m_nWidth*3+k*3;

  51. red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);

  52. TG=j*m_nWidth*3+k*3+1;

  53. green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);

  54. TB=j*m_nWidth*3+k*3+2;

  55. blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);

  56. }

  57. }

  58. }

  59. //对新图像赋值

  60. ImageSize[i]=(unsigned char)(red);

  61. ImageSize[i+1]=(unsigned char)(green);

  62. ImageSize[i+2]=(unsigned char)(blue);

  63. }

  64.  
  65. fwrite(ImageSize,m_nImage,1,fpw);

  66. fclose(fpo);

  67. fclose(fpw);

  68. numPicture = 2;

  69. level=400;

  70. Invalidate();

  71. }

        运行效果如下图所示:


        4.中值滤波
        中值滤波我的理解是:它不但可以去除孤点噪声,而且可以保持图像的边缘特性,不会产生显著的模糊;它的方法是把局部区域的像素按灰度等级进行排序,再取该邻域中灰度的中值作为当前像素的灰度值。其步骤如下:
        (1).将滤波模板(含若干个点的滑动窗口)在图像中漫游,并将模板中心与图像中的某个像素位置重合;
        (2).读取模板中各对应像素的灰度值;
        (3).将这些灰度值从小到大排序;
        (4).取这一列数据的中间数据,将其赋值给对应模板中心位置的像素。
        我采用的是3*3的模本,取矩阵中间位置像素替代原像素。代码如下:

 
  1. //中值滤波

  2. void CImageProcessingView::OnTxzqZzlb()

  3. {

  4. if(numPicture==0) {

  5. AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);

  6. return;

  7. }

  8. AfxMessageBox("图像增强(平滑)!选取的模板为:中值滤波",MB_OK,0);

  9.  
  10. //打开临时的图片

  11. FILE *fpo = fopen(BmpName,"rb");

  12. FILE *fpw = fopen(BmpNameLin,"wb+");

  13. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  14. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  15. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  16. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  17. fread(m_pImage,m_nImage,1,fpo);

  18.  
  19. //new和delete有效的进行动态内存的分配和释放

  20. unsigned char *ImageSize;

  21. ImageSize = new unsigned char[m_nImage];

  22. int X,Y; //一维坐标转换为二维坐标

  23. int TR,TG,TB; //记录红绿蓝坐标位置

  24.  
  25. //选取它为中心的周围9个点像素(注意一个点为RGB)

  26. int H[9]={0,0,0,0,0,0,0,0,0};

  27. int HWS=3; //维数为三维

  28.  
  29. //图像增强:平滑 它要获取源图像周围9个点的矩阵乘以模板9个点的矩阵,故一维图像转二维

  30. for(int i=0; i<m_nImage ; i=i+3 )

  31. {

  32. //原图:一维矩阵转换为二维矩阵

  33. X=(i/3)%m_nWidth; //图像在X列

  34. Y=(i/3)/m_nWidth; //图像在Y行

  35.  
  36. //第一行 第一列 最后一行 最后一列 直接复制

  37. if(X==0 || Y==0 || X==m_nWidth*3 || Y==m_nHeight)

  38. {

  39. if(i+2>m_nImage) break;

  40. ImageSize[i] = m_pImage[i];

  41. ImageSize[i+1] = m_pImage[i+1];

  42. ImageSize[i+2] = m_pImage[i+2];

  43. continue;

  44. }

  45.  
  46. //对图像进行像素求和并取平均值 HWS维数

  47. int num=0;

  48. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  49. {

  50. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  51. {

  52. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight ) //防止越界

  53. {

  54. //获取当前位置Red像素 k一次增加RGB三个像素 R=G=B

  55. TR = j*m_nWidth*3+k*3;

  56. H[num] = m_pImage[TR];

  57. num++;

  58. }

  59. }

  60. }

  61. //排序获取中间值

  62. int temp=0;

  63. for(int x=0;x<9;x++)

  64. {

  65. for(int y=x;y<9;y++)

  66. {

  67. if(H[x]>=H[y])

  68. {

  69. temp=H[x];

  70. H[x]=H[y];

  71. H[y]=temp;

  72. }

  73. }

  74. }

  75. //CString str;

  76. //str.Format("矩阵:%d %d %d, %d %d %d, %d %d %d",H[0],H[1],H[2],H[3],H[4],H[5],H[6],H[7],H[8]);

  77. //AfxMessageBox(str);

  78.  
  79. //对新图像赋值 灰度图像RGB相同

  80. ImageSize[i]=H[4];

  81. ImageSize[i+1]=H[4];

  82. ImageSize[i+2]=H[4];

  83. }

  84.  
  85. fwrite(ImageSize,m_nImage,1,fpw);

  86. fclose(fpo);

  87. fclose(fpw);

  88. numPicture = 2;

  89. level=400;

  90. Invalidate();

  91. }

        运行效果如下图所示:


        PS:这部分总算讲述完成,算法都是根据自己的理解用底层代码实现的,而不是向其它的通过调用GDI+库实现。可能存在因为理解不够或其它的错误,欢迎提出修改~
        推荐资料:
        图像平滑处理——OpenCV        数字图像处理学习笔记——图像平滑锐化 
        中值滤波

        

 

四. 图像锐化

       有时还需要加强图像中景物的边缘和轮廓,边缘和轮廓通常位于图像中灰度突出的地方,因而可以直观的想到用灰度的差分对边缘和轮廓进行提取,通常可以通过梯度算子进行提取。图像锐化的目的是提高图像的对比度,从而使图像更清晰,通过提高邻域内像素的灰度差来提高图像的对比度。
       下面介绍图像锐化的几种算子及效果。
        1.拉普拉斯算子(Laplacian)
        拉普拉斯算子是图像邻域内像素灰度差分计算的基础,通过二阶微分推导出的一种图像邻域增强算法。它的基本思想是当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该被进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
        在算法实现过程中,通过对邻域中心像素的四方向或八方向求梯度,并将梯度和相加来判断中心像素灰度与邻域内其他像素灰度的关系,并用梯度运算的结果对像素灰度进行调整。
        一个连续的二元函数f(x,y),其拉普拉斯运算定义为:

        对于数字图像,拉普拉斯算子可以简化为:

        也可以表示为卷积的形式:

        其中K=1,I=1时H(r,s)取下式,四方向模板:


        通过模板可以发现,当邻域内像素灰度相同时,模板的卷积运算结果为0;当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积为负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。
        其中实现过程步骤如下:
        添加子菜单和类向导添加实现函数

        代码如下:

 
  1. /*****************************************/

  2. /* 图像锐化:我在menu中创建5个子的menu */

  3. /* 防止出现平滑错误,一次只调用一个下拉单 */

  4. /* ID_RH_Laplacian Laplacian拉普拉斯算子 */

  5. /* ID_RH_Sobel Sobel算子 */

  6. /* ID_RH_Prewitt Prewitt算子 */

  7. /* ID_RH_Isotropic Isotropic算子 */

  8. /* ID_RH_GTMB 高通模板H2 */

  9. /*****************************************/

  10.  
  11. void CImageProcessingView::OnRHLaplacian()

  12. {

  13. if(numPicture==0)

  14. {

  15. AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);

  16. return;

  17. }

  18. AfxMessageBox("图像增强(锐化):采用拉普拉斯(Laplacian)算子!");

  19.  
  20. //模板维数:此四个模板均为3维的

  21. int HWS=3;

  22. int H[3][3]={{0,-1,0}, //模板为拉普拉斯算子(中心为4的Laplacian)

  23. {-1,4,-1},

  24. {0,-1,0}};

  25.  
  26. //读写文件

  27. FILE *fpo = fopen(BmpName,"rb");

  28. FILE *fpw = fopen(BmpNameLin,"wb+");

  29. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  30. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  31. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  32. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  33. fread(m_pImage,m_nImage,1,fpo);

  34.  
  35. //new和delete有效的进行动态内存的分配和释放

  36. unsigned char *ImageSize;

  37. ImageSize=new unsigned char[m_nImage];

  38. int red,green,blue;

  39. int X,Y; //一维坐标转换为二维坐标

  40. int TR,TG,TB; //记录红绿蓝坐标位置

  41.  
  42. //图像增强 锐化

  43. for(int i=0; i<m_nImage ; i=i+3 )

  44. {

  45. X=(i/3)%m_nWidth; //X列

  46. Y=(i/3)/m_nWidth; //Y行

  47. red=green=blue=0;

  48.  
  49. //对图像进行像素求和并取平均值 HWS维数

  50. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  51. {

  52. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  53. {

  54. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )

  55. {

  56.  
  57. TR=j*m_nWidth*3+k*3;

  58. red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);

  59. TG=j*m_nWidth*3+k*3+1;

  60. green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);

  61. TB=j*m_nWidth*3+k*3+2;

  62. blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);

  63. }

  64. }

  65. }

  66. //对新图像赋值

  67. if(red>=0 && red<256) ImageSize[i]=red;

  68. else if(red<0) ImageSize[i]=0; //ImageSize[i]=-red;

  69. else ImageSize[i]=0;

  70.  
  71. if(green>=0 && green<256) ImageSize[i+1]=green;

  72. else if(green<0) ImageSize[i+1]=0; //ImageSize[i+1]=-green;

  73. else ImageSize[i+1]=0;

  74.  
  75. if(blue>=0 && blue<256) ImageSize[i+2]=blue;

  76. else if(blue<0) ImageSize[i+2]=0; //ImageSize[i+2]=-blue;

  77. else ImageSize[i+2]=0;

  78. }

  79.  
  80. fwrite(ImageSize,m_nImage,1,fpw);

  81. fclose(fpo);

  82. fclose(fpw);

  83. numPicture = 2;

  84. level=400;

  85. Invalidate();

  86. }

        运行效果如下图所示:


        2.高通滤波
        常用的高通模板如下所示,其中H2有的书又称为拉普拉斯八方向的锐化模板。

        选取H2模板,代码如下所示:

 
  1. //高通模板

  2. void CImageProcessingView::OnRhGtmb()

  3. {

  4. if(numPicture==0)

  5. {

  6. AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);

  7. return;

  8. }

  9. AfxMessageBox("图像增强(锐化):采用高通模板!");

  10.  
  11. int HWS=3;

  12. int H[3][3]={{-1,-1,-1},

  13. {-1,8,-1},

  14. {-1,-1,-1}};

  15.  
  16. FILE *fpo = fopen(BmpName,"rb");

  17. FILE *fpw = fopen(BmpNameLin,"wb+");

  18. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  19. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  20. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  21. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  22. fread(m_pImage,m_nImage,1,fpo);

  23.  
  24. unsigned char *ImageSize;

  25. ImageSize=new unsigned char[m_nImage];

  26. int red,green,blue;

  27. int X,Y;

  28. int TR,TG,TB;

  29.  
  30. //图像增强 锐化

  31. for(int i=0; i<m_nImage ; i=i+3 )

  32. {

  33. X=(i/3)%m_nWidth; //X列

  34. Y=(i/3)/m_nWidth; //Y行

  35. red=green=blue=0;

  36.  
  37. //对图像进行像素求和并取平均值 HWS维数

  38. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  39. {

  40. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  41. {

  42. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )

  43. {

  44.  
  45. TR=j*m_nWidth*3+k*3;

  46. red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);

  47. TG=j*m_nWidth*3+k*3+1;

  48. green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);

  49. TB=j*m_nWidth*3+k*3+2;

  50. blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);

  51. }

  52. }

  53. }

  54.  
  55. //对新图像赋值

  56. if(red>=0 && red<256) ImageSize[i]=red;

  57. else if(red<0) ImageSize[i]=0; //ImageSize[i]=-red;

  58. else ImageSize[i]=0;

  59.  
  60. if(green>=0 && green<256) ImageSize[i+1]=green;

  61. else if(green<0) ImageSize[i+1]=0; //ImageSize[i+1]=-green;

  62. else ImageSize[i+1]=0;

  63.  
  64. if(blue>=0 && blue<256) ImageSize[i+2]=blue;

  65. else if(blue<0) ImageSize[i+2]=0; //ImageSize[i+2]=-blue;

  66. else ImageSize[i+2]=0;

  67. }

  68.  
  69. fwrite(ImageSize,m_nImage,1,fpw);

  70. fclose(fpo);

  71. fclose(fpw);

  72. numPicture = 2;

  73. level=400;

  74. Invalidate();

  75. }

        运行效果如下图所示,该效果相对较好:




       3.Sobel算子

        代码如下所示,需要注意X和Y两个方向的模板处理:

 
  1. //Sobel算子采用PPT上的d(x)d(y)模板

  2. void CImageProcessingView::OnRHSobel()

  3. {

  4. if(numPicture==0)

  5. {

  6. AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);

  7. return;

  8. }

  9. AfxMessageBox("图像增强(锐化):采用Sobel算子!");

  10.  
  11. int HWS=3;

  12. //模板为Sobel算子

  13. int HX[3][3]={{1,0,-1},{2,0,-2},{1,0,-1}};

  14. int HY[3][3]={{-1,-2,-1},{0,0,0},{1,2,1}};

  15.  
  16. FILE *fpo = fopen(BmpName,"rb");

  17. FILE *fpw = fopen(BmpNameLin,"wb+");

  18. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  19. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  20. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  21. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  22. fread(m_pImage,m_nImage,1,fpo);

  23.  
  24. unsigned char *ImageSize;

  25. ImageSize=new unsigned char[m_nImage];

  26. int redX,greenX,blueX;

  27. int redY,greenY,blueY;

  28. int X,Y;

  29. int TR,TG,TB;

  30.  
  31. //图像增强 锐化

  32. for(int i=0; i<m_nImage ; i=i+3 )

  33. {

  34. X=(i/3)%m_nWidth; //X列

  35. Y=(i/3)/m_nWidth; //Y行

  36. redX=greenX=blueX=0;

  37. redY=greenY=blueY=0;

  38.  
  39. //对图像进行像素求和并取平均值 HWS维数

  40. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  41. {

  42. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  43. {

  44. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )

  45. {

  46.  
  47. TR=j*m_nWidth*3+k*3;

  48. redX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);

  49. redY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);

  50. TG=j*m_nWidth*3+k*3+1;

  51. greenX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);

  52. greenY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);

  53. TB=j*m_nWidth*3+k*3+2;

  54. blueX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);

  55. blueY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);

  56. }

  57. }

  58. }

  59. //s=(d(x)*d(x)+d(y)*d(y))开根号

  60. int R,G,B;

  61. R=(int)(sqrt(redX*redX*1.0+redY*redY*1.0));

  62. G=(int)(sqrt(greenX*greenX*1.0+greenY*greenY*1.0));

  63. B=(int)(sqrt(blueX*blueX*1.0+blueY*blueY*1.0));

  64.  
  65. if(redX<0 && redY<0) ImageSize[i]=0;

  66. else if(R>255) ImageSize[i]=255;

  67. else ImageSize[i]=R;

  68.  
  69. if(greenX<0 && greenY<0) ImageSize[i+1]=0;

  70. else if(G>255) ImageSize[i+1]=255;

  71. else ImageSize[i+1]=G;

  72.  
  73. if(blueX<0 && blueY<0) ImageSize[i+2]=0;

  74. else if(B>255) ImageSize[i+2]=255;

  75. else ImageSize[i+2]=B;

  76. }

  77.  
  78. fwrite(ImageSize,m_nImage,1,fpw);

  79. fclose(fpo);

  80. fclose(fpw);

  81. numPicture = 2;

  82. level=400;

  83. Invalidate();

  84. }

        运行效果如下图所示:

        如果采用Sobel边缘细化,建议二值化(0和255阈值化)处理后再锐化,彩色图建议先灰度处理再进行其他处理。


      4.Isotropic算子

        代码实现如下:

 
  1. //Isotropic算子采用PPT上的d(x)模板 d(y)

  2. void CImageProcessingView::OnRHIsotropic()

  3. {

  4. if(numPicture==0)

  5. {

  6. AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);

  7. return;

  8. }

  9.  
  10. AfxMessageBox("图像增强(锐化):采用Isotropic算子!");

  11.  
  12. int HWS=3;

  13. //模板为Isotropic算子

  14. float HX[3][3]={{1,0,-1},

  15. {sqrt(2.0),0,-sqrt(2.0)},

  16. {1,0,-1} };

  17. float HY[3][3]={{-1,-sqrt(2.0),-1},

  18. {0,0,0},

  19. {1,sqrt(2.0),1} };

  20.  
  21. FILE *fpo = fopen(BmpName,"rb");

  22. FILE *fpw = fopen(BmpNameLin,"wb+");

  23. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  24. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  25. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  26. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  27. fread(m_pImage,m_nImage,1,fpo);

  28.  
  29. unsigned char *ImageSize;

  30. ImageSize=new unsigned char[m_nImage];

  31. float redX,greenX,blueX;

  32. float redY,greenY,blueY;

  33. int X,Y;

  34. int TR,TG,TB;

  35.  
  36. //图像增强

  37. for(int i=0; i<m_nImage ; i=i+3 )

  38. {

  39. X=(i/3)%m_nWidth; //X列

  40. Y=(i/3)/m_nWidth; //Y行

  41. redX=greenX=blueX=0;

  42. redY=greenY=blueY=0;

  43.  
  44. //对图像进行像素求和并取平均值 HWS维数

  45. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  46. {

  47. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  48. {

  49. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )

  50. {

  51.  
  52. TR=j*m_nWidth*3+k*3;

  53. redX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);

  54. redY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);

  55. TG=j*m_nWidth*3+k*3+1;

  56. greenX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);

  57. greenY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);

  58. TB=j*m_nWidth*3+k*3+2;

  59. blueX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);

  60. blueY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);

  61. }

  62. }

  63. }

  64. //对新图像赋值 s=(d(x)*d(x)+d(y)*d(y))开根号

  65. int R,G,B;

  66. R=(int)(sqrt(redX*redX*1.0+redY*redY*1.0));

  67. G=(int)(sqrt(greenX*greenX*1.0+greenY*greenY*1.0));

  68. B=(int)(sqrt(blueX*blueX*1.0+blueY*blueY*1.0));

  69.  
  70. if(redX<0 && redY<0) ImageSize[i]=0;

  71. else if(R>255) ImageSize[i]=255;

  72. else ImageSize[i]=R;

  73.  
  74. if(greenX<0 && greenY<0) ImageSize[i+1]=0;

  75. else if(G>255) ImageSize[i+1]=255;

  76. else ImageSize[i+1]=G;

  77.  
  78. if(blueX<0 && blueY<0) ImageSize[i+2]=0;

  79. else if(B>255) ImageSize[i+2]=255;

  80. else ImageSize[i+2]=B;

  81. }

  82. fwrite(ImageSize,m_nImage,1,fpw);

  83. fclose(fpo);

  84. fclose(fpw);

  85. numPicture = 2;

  86. level=400;

  87. Invalidate();

  88. }

        运行效果如下图所示,效果与上面的Sobel类似:


       5.Prewitt算子

        代码如下图所示:

 
  1. //Prewitt算子采用PPT上的d(x)模板,不是d(y)

  2. void CImageProcessingView::OnRHPrewitt()

  3. {

  4.  
  5. if(numPicture==0)

  6. {

  7. AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);

  8. return;

  9. }

  10. AfxMessageBox("图像增强(锐化):采用Prewitt算子!");

  11.  
  12. int HWS=3;

  13. int H[3][3]={{1,0,-1}, //模板为Prewitt算子

  14. {1,0,-1},

  15. {1,0,-1}};

  16.  
  17. FILE *fpo = fopen(BmpName,"rb");

  18. FILE *fpw = fopen(BmpNameLin,"wb+");

  19. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  20. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  21. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  22. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  23. fread(m_pImage,m_nImage,1,fpo);

  24.  
  25. unsigned char *ImageSize;

  26. ImageSize=new unsigned char[m_nImage];

  27. int red,green,blue;

  28. int X,Y;

  29. int TR,TG,TB;

  30.  
  31. //图像增强:平滑

  32. for(int i=0; i<m_nImage ; i=i+3 )

  33. {

  34. X=(i/3)%m_nWidth; //X列

  35. Y=(i/3)/m_nWidth; //Y行

  36. red=green=blue=0;

  37.  
  38. //对图像进行像素求和并取平均值 HWS维数

  39. for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ ) //第j行

  40. {

  41. for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ ) //第k列

  42. {

  43. if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )

  44. {

  45.  
  46. TR=j*m_nWidth*3+k*3;

  47. red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);

  48. TG=j*m_nWidth*3+k*3+1;

  49. green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);

  50. TB=j*m_nWidth*3+k*3+2;

  51. blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);

  52. }

  53. }

  54. }

  55. //对新图像赋值

  56. if(red>=0 && red<256) ImageSize[i]=red;

  57. else if(red<0) ImageSize[i]=0; //ImageSize[i]=-red;

  58. else ImageSize[i]=0;

  59.  
  60. if(green>=0 && green<256) ImageSize[i+1]=green;

  61. else if(green<0) ImageSize[i+1]=0; //ImageSize[i+1]=-green;

  62. else ImageSize[i+1]=0;

  63.  
  64. if(blue>=0 && blue<256) ImageSize[i+2]=blue;

  65. else if(blue<0) ImageSize[i+2]=0; //ImageSize[i+2]=-blue;

  66. else ImageSize[i+2]=0;

  67. }

  68. fwrite(ImageSize,m_nImage,1,fpw);

  69. fclose(fpo);

  70. fclose(fpw);

  71. numPicture = 2;

  72. level=400;

  73. Invalidate();

  74. }

        运行效果如下图所示,只选取了X分量:


 

        

//

转载:https://blog.csdn.net/eastmount/article/details/46378783

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

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

相关文章

南京大学教授施斌及其团队—— 光纤变“神经” 大地能感知

来源&#xff1a;人民日报你能相信吗&#xff1f;一根头发丝粗细的光纤&#xff0c;根据不同地质环境和多场监测要求&#xff0c;穿上各种“定制”的外衣&#xff0c;就能变身敏感强健的“大地感知神经”&#xff0c;使得大地一有灾害异动&#xff0c;远在千里之外的监测系统就…

MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示…

0pencv——图像腐蚀

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("小狗1.jpg");imshow("显示图像", srcImage);Mat element getStructuringElement(MORPH_RECT, Size(…

腾讯研究院发布:《人工智能+制造产业发展研究》报告

来源&#xff1a;腾讯研究院摘要&#xff1a;工业革命以后的“自动化”概念追求的是机器自动生产&#xff0c;本质是“机器替人”&#xff0c;强调在完全不需要人的情况下进行不间断的大规模机器生产&#xff1b;而“智能化”追求的是机器的柔性生产&#xff0c;本质是“人机协…

Opencv——图像模糊

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("小狗1.jpg");imshow("原图像", srcImage);Mat dstImage;blur(srcImage, dstImage, Size(5, 5));imsh…

Android开发中依赖注入的应用

什么是依赖注入&#xff1f; 依赖是指一个对象持有其他对象的引用。依赖注入则是将这些依赖对象传递给被依赖对象&#xff0c;而不是被依赖对象自己创建这些对象。 public class MyClass{private AnotherClass mAnotherObject;public MyClass(){mAnotherObject new AnotherCla…

工业富联2018年报来了!上市后首张成绩单大起底

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云…

Opencv——图像膨胀

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("小狗1.jpg");imshow("原图像", srcImage);Mat dstImage;Mat element getStructuringElement(MORPH_…

深度学习背后的基础-神经网络揭秘

来源&#xff1a;混沌巡洋舰摘要&#xff1a;最近&#xff0c; 深度学习三杰获得了计算机界最重要的图灵奖&#xff0c; 它们的贡献都集中在对深度学习的根据神经网络的理论突破。 今天我们看到的所有和人工智能有关的伟大成就&#xff0c; 从阿法狗到自动驾驶&#xff0c; 从海…

Opencv——灰度变换、直方图均衡化

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("lena.bmp");Mat grayImage;cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);Mat dstImage;equalizeHist(grayIm…

并发模型之——共享内存模型(线程与锁)理论篇

这里我们使用Java的线程与锁来解析共享内存模型&#xff1b;做过java开发并且了解线程安全问题的知道&#xff0c;要使某段代码是线程安全的那必须要满足两个条件&#xff1a;内存可见性、原子性&#xff1b; 内存可见性 在JVM规定多个线程进行通讯是通过共享变量进行的&a…

谷歌员工怒了 900人联名抗议 刚成立的AI道德委员会处境尴尬

来源&#xff1a;网易智能谷歌员工又怒了。3月26日&#xff0c;谷歌宣布成立人工智能项目外部顾问委员会&#xff0c;该委员会将与谷歌就面部识别和公平性等人工智能的主要问题进行磋商。争议的焦点在于&#xff0c;谷歌将保守派传统基金会(Heritage Foundation)主席凯科尔斯詹…

Opencv——基于索引表的图像细化

图像细化针对的是二值图像 或者用阀值处理的二值图像。基于索引表的细化算法大致是遍历被二值化图像的边缘&#xff0c;根据边缘点的八连通域情况查找索引表以确定该边缘点是否能够被删除。根据一些细化规则我们可以建立索引表&#xff0c;因此我们的主要工作就是不断地遍历边…

DeepMind推出首个商业产品,30秒内准确诊断眼疾!

来源&#xff1a;Financial Times、智东西编译摘要&#xff1a;这个设备能像最好的医学专家一样&#xff0c;准确地诊断各种眼部疾病。4月1日&#xff0c;谷歌母公司Alphabet旗下位于伦敦的AI部门DeepMind已打造出了可诊断复杂眼部疾病的商业医疗设备原型&#xff0c;这将是Dee…

Opencv——Sobel边缘检测

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("lena.jpg");Mat dstImage_x, dstImage_y;Sobel(srcImage, dstImage_x, CV_8U, 1, 0);Sobel(srcImage, dstImag…

Head first servlet and jsp学习笔记

学习中遇到的问题&#xff1a;java基础不行&#xff0c;都忘光了。 主要是&#xff1a;继承&#xff0c;接口&#xff0c;多线程&#xff0c;IO。尤其是多线程&#xff0c;在分布式系统中应该使用的比较多 第一章&#xff1a;前言和体系结构 HTTP协议&#xff1a; TCP/IP的上层…

一文解析|首个上榜科创板的机器人企业,江苏北人“闯关记”

来源&#xff1a;机器人大讲堂摘要&#xff1a;随着上交所公布了科创板首批受理上市申请的企业名单&#xff0c;这九家企业的每一家都被拿到放大镜下细细观察&#xff0c;评头论足。而其中&#xff0c;江苏北人作为登上科创版的首家机器人企业似乎受到的关注最多。江苏北人是一…

Matlab——绘制基础曲线

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 x0:0.02:10; y1sin(x); y22*sin(x); plot(x,y1,b*:,x,y2,r-); %设置颜色、标记和线型 axis([0 pi 0 2]); %设置坐标轴 title(正弦曲…

2018年中美独角兽研究报告

来源&#xff1a;前瞻产业研究院截至2018年12月31日&#xff0c;中国共有205家独角兽企业&#xff0c;占全球独角兽总量的48%&#xff0c;美国共有149家独角兽企业&#xff0c;占全球独角兽总量的35%。中美独角兽行业估值结构差异明显&#xff0c; 但总体看来&#xff0c;对于中…

Matlab——高斯白噪声处理

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(eight.tif); Aimnoise(I,gaussian,0,0.05); %加入高斯白噪声 JA; M3; %设置叠加次数 Jim2double(J); Iim2…