/*********************************************************************
对灰度图进行位二值化,输入图像像素部分的宽度和高度以及存储灰度像素值
得一维数组,对灰度值进行直方图统计,通过OSTU大律法公式,确定自动灰度
图的阈值,进而进行二值化处理,存储
*********************************************************************/
#include "StdAfx.h"
#include<iostream>
#include<Windows.h>
using namespace std;
void glay(DWORD w,DWORD h, unsigned char * newImageData)
{
/***************对灰度图的像素值进行统计************************/int graycolor[256];                                         //定义灰度等级存储数组,用来存储每个颜色等级的像素数量int smooth_graycolor[51];                                   //平滑后灰度信息存储数组unsigned char *Binarization=new unsigned char[w*h];         //复制灰度图像的像素值for (int n=0;n<256;n++)  graycolor[n]=0;int k;                                                      //用来临时存储每个像素点的灰度值for(int i=0;i<h;i++){for (int j=0;j<w;j++){*(Binarization+i*w+j)=*(newImageData+i*w+j);k=*(Binarization+i*w+j);//cout<<k;graycolor[k]++;}}//for(int a=0;a<256;a++)//{cout<<graycolor[a]<<"\t";}                                //输出每个颜色等级的灰度像素数量/***************对灰度图的像素值进行直方图平滑选择临近五个坐标***********************int sumgray=0;                                               //相邻五个灰度等级的值int ave_sumgray=0;for(int i=1;i<52;i++){for(int j=(i-1)*5;j<i*5;j++){if(i=51){for(int k=250;k<256;k++){sumgray=graycolor[k]+sumgray;}}else{sumgray=graycolor[j]+sumgray;}}cout<<sumgray<<endl;ave_sumgray=(int)sumgray/5;smooth_graycolor[i-1]=ave_sumgray;}for(int b=0;b<51;b++){cout<<smooth_graycolor[b]<<"\t";}                                //输出每个颜色等级的灰度像素数量*//*************************OSTU大律法公式参看http://blog.csdn.net/zyzhangyue/article/details/45841255*********************************/
//计算每个直方图占总数的概率double Prob_gray[256];              //存储每个直方图占总数的概率for(int a=0;a<256;a++){Prob_gray[a]=(double)graycolor[a]/(w*h);//cout<<a<<":"<<Prob_gray[a]<<endl;   //输出每个灰度级的像素数量占用总像素数量的概率}
//定义两个数组存储计算的概率,假设t为阙值,计算每个t的前后像素的概率double Pa=0,Pa1=0,Pb=0,Pb1=0;      //存储概率double Wa[256],Wb[256],Wo[256],Wz[256],Wz1[256];//存储概率的数组,Wa为A区域的平均灰度值,Wb为B区域的平均灰度值,
//Wo为图像全局的灰度平均值,Wz,Wz1 A、B两个区域的类间方差for (int t=0;t<256;t++){Wa[t]=0;Wb[t]=0;Wo[t]=0;Wz[t]=0;Wz1[t]=0;}for (int t=0;t<256;t++){Pa=0;Pb=0;Pa1=0;Pb1=0;for(int p=0;p<t+1;p++){Pa=Prob_gray[p]*p+Pa;Pa1=Prob_gray[p]+Pa1;}Wa[t]=Pa/Pa1;        //每个t的前几项的概率方差//cout<<Wa[t]<<endl;for(int q=t+1;q<256;q++){Pb=Prob_gray[q]*q+Pb;Pb1=Prob_gray[q]+Pb1;}Wb[t]=Pb/Pb1;        //每个t的后几项的概率方差Wo[t]=Wa[t]*Pa1+Wb[t]*Pb1;Wz[t]=Pa1*(Wa[t]-Wo[t])*(Wa[t]-Wo[t])+Pb1*(Wb[t]-Wo[t])*(Wb[t]-Wo[t]);//cout<<Wz[t]<<endl;         //输出每个灰度级作为分割线后前后的方差} double max=0;         //存储最大的方差值int    Threshold=0;   //存储作为阈值的灰度级for (int t=0;t<256;t++){Wz1[t]=Wz[t];if(Wz1[t]>max) max=Wz1[t];}cout<<"max"<<max<<endl;       //输出的为最大的方差for (int t=0;t<256;t++){if(Wz[t]>=max)Threshold=t; }/*************************二值化灰度图像*********************************/int m=0;for(int i=0;i<h;i++){for (int j=0;j<w;j++){m=*(Binarization+i*w+j);if(m>=Threshold)  *(Binarization+i*w+j)=255;else *(Binarization+i*w+j)=0;}}
/*************************窗口中绘制图像显示*********************************/HWND wnd;                                 //窗口句柄HDC dc;                                   //绘图设备环境句柄unsigned char *p2;                         //临时像素指针int r2,pix2;int x2=300,y2=300;wnd=GetForegroundWindow();               //获取窗口句柄dc=GetDC(wnd);                           //获取绘图设备p2=Binarization;for(int j=0;j<h;j++){for(int i=0;i<w;i++){r2=*p2++;pix2=RGB(r2,r2,r2);//指定要用来绘制该点的颜色SetPixel(dc,x2+i,y2+h-j,pix2);//在屏幕中绘制此像素}}/**********************构造新图像的文件信息头*********************/int nWidthBytes=(w*3+3)/4*4;            //计算每行的字节数BITMAPFILEHEADER newheader={0};newheader.bfType=MAKEWORD('B','M');newheader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;newheader.bfSize=newheader.bfOffBits+h*nWidthBytes/3;//头文件加位图实际大小
/**********************构造灰度图的位图信息头*********************/BITMAPINFOHEADER targetinfoheader={0};targetinfoheader.biBitCount=8;targetinfoheader.biSize=sizeof(BITMAPINFOHEADER);targetinfoheader.biHeight=h;targetinfoheader.biWidth=w;targetinfoheader.biPlanes=1;targetinfoheader.biCompression=BI_RGB;targetinfoheader.biSizeImage=nWidthBytes*h/3;targetinfoheader.biXPelsPerMeter=0;targetinfoheader.biYPelsPerMeter=0;targetinfoheader.biClrImportant=0;targetinfoheader.biClrUsed=0;
/*****************构造灰度图的调色板信息需要256个*****************/RGBQUAD rgbquad[256];int i;for(i=0;i<256;i++){rgbquad[i].rgbBlue=i;rgbquad[i].rgbGreen=i;rgbquad[i].rgbRed=i;rgbquad[i].rgbReserved=0;}
/*****************将灰度图像的信息写入到文件中*****************/FILE *fpw1;                                 //定义保存文件指针unsigned char *p,*p3;                               //像素指针char fileName3[300];                       //定义打开保存图像名字cout<<"请输入要保存文件的名字:";cin>>fileName3;if((fpw1=fopen(fileName3,"wb"))==NULL){cout<<"文件未找到!";exit(0);}fwrite(&newheader,sizeof(newheader),1,fpw1);  //写入文件头fwrite(&targetinfoheader,sizeof(BITMAPINFOHEADER),1,fpw1);//写入位图信息头fwrite(&rgbquad,sizeof(RGBQUAD),256,fpw1);    //写入调色板信息p3= Binarization;                      //得到存储灰度像素信息的一维数组地址for (int i=0;i<w*h;i++) {fwrite(p3++,1,1,fpw1);}fclose(fpw1);
}

c++对8位灰度图进行二值化处理相关推荐

  1. RGB 转换为灰度图、二值化图

    from PIL import Image I = Image.open('lena.png') I.show() L = I.convert('L') #转化为灰度图 L = I.convert(' ...

  2. 小白入门计算机视觉(二) : 图像基本处理----灰度图和二值化

    文章目录 解剖图像 图像处理基本原理 RGB模型 灰度 二值化 图像失真问题 从本节开始,我就要正式踏上小白的计算机视觉探索之路,先从图像基础学习吧 解剖图像 要学会图像处理首先就得知道图像的结构,平 ...

  3. 使用openCV进行边缘检测、二值化、轮廓、轮廓检测、BGR、灰度图、二值化,专栏:各种openCV实践的案例

    专栏连接:openCV练习-各种openCV实践的案例 前言 使用OpenCV的轮廓检测,当我们加入对象的边界上的所有点时,我们得到一个轮廓. 通常,特定轮廓区域与边界像素有关,具有相似的颜色和强度. ...

  4. c语言实现灰度图转换为二值图

    转载自:https://www.cnblogs.com/wd1001/p/4571916.html c语言实现灰度图转换为二值图 将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置 ...

  5. opencv:把三通道图转换成灰度图、二值图

    #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<openc ...

  6. 利用Floyd-Steinberg方法(dithering),将灰度图转换为二值图

    灰度图有256级灰度,而二值图只有黑白两色.颜色数目大大降低,直观感觉转换效果不会好.其实人眼类似于一个低通滤波器,你看到的并不是一个一个像素点,而是接受的颜色信息是一个区域内的颜色信息的综合效果. ...

  7. MATLAB从原图,灰度图,二值图,反白图,边缘检测

    MATLAB数字图像处理,使用MATLAB可以将一张图变为"线稿"(显然效果不太行,可以再使用PS),如图: 一.读取一张图片的文件.方法详见:读取,剪裁一张图像. 比如我们打开一 ...

  8. java生成点阵图_android使用JNI图片转黑白图片实现点阵图(二值化)

    [实例简介] 为android提供的二值化jni库,和完整demo,比Java代码的效率高10s! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例 ...

  9. c#图像灰度化、灰度反转、二值化

    图像灰度化: 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*2 ...

最新文章

  1. 100行的python作品详解_不到 100 行 Python 代码徐峥变葛优
  2. 统计学---极端异常值的检测
  3. winform界面嵌入dwg图纸_c# cad中插入另一个dwg的图块
  4. 8家大厂SSP offer的清华学长谈算法岗是否人间地狱(送七本学长手写iPad笔记)...
  5. 从用户反馈的可解释性提升推荐模型
  6. maven 父maven_Maven的鸟瞰图
  7. vue的一些基本指令,搭建、编译、运行、打包
  8. css3中skew与rotateX(),rotateY()的用法
  9. Maybe it's time to go away
  10. 新浪财经三人行:专家谈萨班斯法案聊天实录
  11. 参加Oracle OCP和MySQL OCP考试的学员怎样在VUE预约考试
  12. 二维码图片处理换logo,加文字
  13. [规划酱@国土空间] ArcGIS工具| 三调转换之新用地用海分类
  14. 数据库性能优化的五种方案(mycat,基于阿里coba开源的数据库中间件,很容易实现分库分表、主从切换功能。另一个当当网开源的一个库 sharding-jdbc)
  15. 操作系统期末大题类型题解
  16. wifi共享大师开启失败发射功能失败
  17. K8S-5--云原生基础/k8s基础及组件/二进制部署k8s集群
  18. 什么是数据中台系统 - whale帷幄
  19. ios设备管理软件imazing 2.16.2官网下载,2022年强悍来袭!
  20. GPS 驯服时钟原理

热门文章

  1. android仿微信、QQ等聊天界面,实现点击输入框弹出软键盘、点击其他区域收起软键盘,默认滑动至最低端
  2. 中国AI行业走向:新人胜旧人还是 BAT 牢牢掌握价值链顶端? | 新智元投资领袖论坛...
  3. 常用的Linux 系统监控工具
  4. MathType如何编辑商标标志
  5. LeetCode笔记05:最长公共前缀
  6. win7系统如何搜索计算机,win7怎样搜索文件?win7系统准确搜索文件的方法
  7. uniapp唤醒手机地图app
  8. 目标检测YOLO实战应用案例100讲-基于多尺度特征融合的水下小目标检测方法研究
  9. 五月集训-14【栈】
  10. 代理模式-Python实现