经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言实现24位彩色图像二值化
来源:jb51  时间:2021/10/25 19:07:46  对本文有异议

本文实例为大家分享了C语言实现24位彩色图像二值化的具体代码,供大家参考,具体内容如下

  1. // huiduhua.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<stdio.h>
  5. #include<windows.h>
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8. BITMAPFILEHEADER bfhead;
  9. BITMAPINFOHEADER bihead;
  10. RGBQUAD *pColorTable;
  11. unsigned char *pBmpBuf;
  12. FILE *fp1=fopen("鼠.bmp","rb");
  13. if(fp1==0)
  14. return 0;
  15. fread(&bfhead,14,1,fp1); //将文件头读入内存
  16. fread(&bihead,40,1,fp1); //将信息头读入内存
  17. int LineByte=(bihead.biWidth*24/8+3)/4*4; //保证每行字节数为4的整数倍
  18. pBmpBuf=new unsigned char[LineByte*bihead.biHeight]; //为数据区分配内存空间
  19. fread(pBmpBuf,LineByte*bihead.biHeight,1,fp1); //将bmp数据区读入内存
  20. fclose(fp1);
  21. printf("Width:%d, Height: %d,biBitCount:%d\n",bihead.biWidth,bihead.biHeight,bihead.biBitCount);
  22. //现将真彩图灰度化
  23. int LineByte1=(bihead.biWidth*8/8+3)/4*4; //由于灰度化后每像素位数变为8,所以每行字节数发生改变,但仍要求为4的整数倍
  24. FILE *fp2=fopen("鼠2.bmp","wb");
  25. if(fp2==0)
  26. return 0;
  27. //更改文件头,并将其保存
  28. bfhead.bfSize=14+40+sizeof(RGBQUAD)*256+LineByte1*bihead.biHeight; //更改文件大小
  29. bfhead.bfOffBits=14+40+sizeof(RGBQUAD)*256; //更改偏移值
  30. fwrite(&bfhead,14,1,fp2);
  31. //更改信息头并将其保存
  32. bihead.biBitCount=8; //更改每像素位数
  33. bihead.biSizeImage=LineByte1*bihead.biHeight; //更改数据区大小
  34. fwrite(&bihead,40,1,fp2);
  35. //因为灰度化图像有颜色表,所以创建颜色表并保存
  36. pColorTable=new RGBQUAD[256];
  37. for(int i=0;i<256;i++)
  38. pColorTable[i].rgbRed = pColorTable[i].rgbGreen = pColorTable[i].rgbBlue = i;//使颜色表中每种颜色的R,G,B分量相等且等于索引值
  39. fwrite(pColorTable,sizeof(RGBQUAD),256,fp2);
  40. //改变数据区
  41. unsigned char *pBmpBuf1;
  42. pBmpBuf1=new unsigned char[LineByte1*bihead.biHeight];
  43. for(int i=0;i<bihead.biHeight;i++)
  44. for(int j=0;j<bihead.biWidth;j++)
  45. {
  46. unsigned char *pb1,*pb2;
  47. pb1=pBmpBuf+i*LineByte+j*3;
  48. int y=*(pb1)*0.299+*(pb1+1)*0.587+*(pb1+2)*0.114;
  49. pb2=pBmpBuf1+i*LineByte1+j;
  50. *pb2=y;
  51. }
  52. //二值化方法一:阈值设为127,灰度值小于127的置零,其他的置为255;
  53. //for(int i=0;i<bihead.biHeight;i++)
  54. // for(int j=0;j<bihead.biWidth;j++)
  55. // {
  56. // unsigned char *pb;
  57. // pb=pBmpBuf1+i*LineByte1+j;
  58. // if(*pb<127) //将每个像素值与127比较
  59. // *pb=0;
  60. // else
  61. // *pb=255;
  62. // }
  63. //方法二:计算像素的平均值K,扫描图像的每个像素值如像素值大于K像素值设为255(白色),值小于等于K像素值设为0(黑色)
  64. int y=0;//像素和
  65. int k=0;//像素个数
  66. for(int i=0;i<bihead.biHeight;i++)
  67. for(int j=0;j<bihead.biWidth;j++)
  68. {
  69. unsigned char *pb;
  70. pb=pBmpBuf1+i*LineByte1+j;
  71. y=y+*pb; //计算所有像素灰度值之和
  72. k++; //统计像素个数
  73. }
  74. y=y/k; //求像素平均值
  75. for(int i=0;i<bihead.biHeight;i++)
  76. for(int j=0;j<bihead.biWidth;j++)
  77. {
  78. unsigned char *pb1;
  79. pb1=pBmpBuf1+i*LineByte1+j;
  80. if(*pb1<y) //将每个像素值与平均值作比较
  81. *pb1=0;
  82. else
  83. *pb1=255;
  84. }
  85.  
  86. fwrite(pBmpBuf1,LineByte1*bihead.biHeight,1,fp2);
  87. fclose(fp2);
  88.  
  89. system("pause");
  90. return 0;
  91. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号