服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现24位彩色图像二值化

C语言实现24位彩色图像二值化

2022-02-15 16:59leozhang C/C++

这篇文章主要为大家详细介绍了C语言实现24位彩色图像二值化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

// huiduhua.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
#include<windows.h>

int _tmain(int argc, _TCHAR* argv[])
{

BITMAPFILEHEADER bfhead;
BITMAPINFOHEADER bihead;
RGBQUAD *pColorTable;
unsigned char *pBmpBuf;
FILE *fp1=fopen("鼠.bmp","rb");
if(fp1==0)
return 0;
fread(&bfhead,14,1,fp1);   //将文件头读入内存
fread(&bihead,40,1,fp1);   //将信息头读入内存
int LineByte=(bihead.biWidth*24/8+3)/4*4; //保证每行字节数为4的整数倍

pBmpBuf=new unsigned char[LineByte*bihead.biHeight]; //为数据区分配内存空间
fread(pBmpBuf,LineByte*bihead.biHeight,1,fp1);       //将bmp数据区读入内存
fclose(fp1); 

printf("Width:%d, Height: %d,biBitCount:%d\n",bihead.biWidth,bihead.biHeight,bihead.biBitCount);


//现将真彩图灰度化
int LineByte1=(bihead.biWidth*8/8+3)/4*4;  //由于灰度化后每像素位数变为8,所以每行字节数发生改变,但仍要求为4的整数倍
FILE *fp2=fopen("鼠2.bmp","wb");
if(fp2==0)
return 0;
//更改文件头,并将其保存
bfhead.bfSize=14+40+sizeof(RGBQUAD)*256+LineByte1*bihead.biHeight;   //更改文件大小
bfhead.bfOffBits=14+40+sizeof(RGBQUAD)*256;   //更改偏移值
fwrite(&bfhead,14,1,fp2);

//更改信息头并将其保存
bihead.biBitCount=8;    //更改每像素位数
bihead.biSizeImage=LineByte1*bihead.biHeight;  //更改数据区大小
fwrite(&bihead,40,1,fp2);

//因为灰度化图像有颜色表,所以创建颜色表并保存
pColorTable=new RGBQUAD[256];
for(int i=0;i<256;i++)
pColorTable[i].rgbRed = pColorTable[i].rgbGreen = pColorTable[i].rgbBlue = i;//使颜色表中每种颜色的R,G,B分量相等且等于索引值
fwrite(pColorTable,sizeof(RGBQUAD),256,fp2);

//改变数据区
unsigned char *pBmpBuf1;
pBmpBuf1=new unsigned char[LineByte1*bihead.biHeight];
for(int i=0;i<bihead.biHeight;i++)
for(int j=0;j<bihead.biWidth;j++)
{
 unsigned char *pb1,*pb2;
 pb1=pBmpBuf+i*LineByte+j*3;
 int y=*(pb1)*0.299+*(pb1+1)*0.587+*(pb1+2)*0.114;
 pb2=pBmpBuf1+i*LineByte1+j;
 *pb2=y;
}
//二值化方法一:阈值设为127,灰度值小于127的置零,其他的置为255;

//for(int i=0;i<bihead.biHeight;i++)
// for(int j=0;j<bihead.biWidth;j++)
// {
//  unsigned char *pb;
//  pb=pBmpBuf1+i*LineByte1+j;
//  if(*pb<127)   //将每个像素值与127比较
//   *pb=0;
//  else
//   *pb=255;
// }
//方法二:计算像素的平均值K,扫描图像的每个像素值如像素值大于K像素值设为255(白色),值小于等于K像素值设为0(黑色)
int y=0;//像素和
int k=0;//像素个数
for(int i=0;i<bihead.biHeight;i++)
for(int j=0;j<bihead.biWidth;j++)
{
 unsigned char *pb;
 pb=pBmpBuf1+i*LineByte1+j;
 y=y+*pb;  //计算所有像素灰度值之和
 k++;      //统计像素个数
}
y=y/k; //求像素平均值
for(int i=0;i<bihead.biHeight;i++)
for(int j=0;j<bihead.biWidth;j++)
{
 unsigned char *pb1;
 pb1=pBmpBuf1+i*LineByte1+j;
 if(*pb1<y)         //将每个像素值与平均值作比较
  *pb1=0;
 else
  *pb1=255;
}

fwrite(pBmpBuf1,LineByte1*bihead.biHeight,1,fp2);
fclose(fp2);

system("pause");
return 0;
}

C语言实现24位彩色图像二值化

C语言实现24位彩色图像二值化

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

原文链接:https://blog.csdn.net/u011450295/article/details/37350011

延伸 · 阅读

精彩推荐
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29