用C语言对BMP图像进行二值化处理
图像二值化实验报告c
竭诚为您提供优质文档/双击可除图像二值化实验报告c篇一:图像处理实验报告1常用mATLAb图像处理命令一、实验目的1、熟悉并掌握mATLAb工具的使用;2、实现图像的读取、显示、代数运算和简单变换。
二、实验环境mATLAb20XXa版本、wIn7计算机三、常用函数?读写图像文件1imreadimread函数用于读入各种图像文件,如:a=imread(e:\w01.tif)2imwriteimwrite函数用于写入图像文件,如:imwrite(a,e:\w02.tif,’tif’)3imfinfoimfinfo函数用于读取图像文件的有关信息,如:imfinfo(e:\w01.tif)?图像的显示1imageimage函数是mATLAb提供的最原始的图像显示函数,如:a=[1,2,3,4;4,5,6,7;8,9,10,11,12];image(a);2imshowimshow函数用于图像文件的显示,如:i=imread(e:\w01.tif);imshow(i);title(‘原图像’)%加上图像标题3colorbarcolorbar函数用显示图像的颜色条,如:i=imread(e:\w01.tif);imshow(i);colorbar;4figurefigure函数用于设定图像显示窗口,如:figure(1);/figure(2);5subplot把图形窗口分成多个矩形部分,每个部分可以分别用来进行显示。
subplot(m,n,p)分成m*n个小窗口,在第p个窗口中创建坐标轴为当前坐标轴,用于显示图形。
6plot绘制二维图形plot(y)plot(x,y)xy可以是向量、矩阵。
?图像类型转换1rgb2gray把真彩图像转换为灰度图像i=rgb2gray(j)2im2bw通过阈值化方法把图像转换为二值图像I=im2bw(j,level)Level表示灰度阈值,取值范围0~1(即0.n),表示阈值取自原图像灰度范围的n%3imresize改变图像的大小I=imresize(j,[mn])将图像j大小调整为m行n列?图像运算1imadd两幅图像相加,要求同样大小,同种数据类型Z=imadd(x,y)表示图像x+y2imsubstract两幅图像相减,要求同样大小,同种数据类型Z=imsubtract(x,y)表示图像x-y3immultiplyZ=immultiply(x,y)表示图像x*y4imdivideZ=imdivide(x,y)表示图像x/y四、心得体会学习了matlab中基本的图像处理命令,为以后图像处理打下了较好的基础。
c语言 二值化算法
c语言二值化算法C语言二值化算法引言:二值化是一种图像处理技术,将灰度图像转化为黑白图像,即将像素点的灰度值映射为0或255。
它在图像处理、计算机视觉、模式识别等领域有着广泛的应用。
本文将介绍C语言中常用的二值化算法及其实现原理。
一、二值化算法的原理二值化算法的核心思想是根据像素点的灰度值将其映射为黑或白两种颜色。
通常情况下,我们选择一个阈值,将灰度值大于阈值的像素点设为白色,小于等于阈值的像素点设为黑色。
这样就实现了图像的二值化。
二、全局阈值二值化算法全局阈值二值化算法是最简单、最常用的二值化算法之一。
其基本原理是通过计算图像的平均灰度值或者直方图,选择一个合适的阈值进行二值化。
具体步骤如下:1. 计算图像的平均灰度值或者直方图;2. 根据选择的阈值将像素点分为两类,大于阈值的设为白色,小于等于阈值的设为黑色;3. 将二值化后的图像输出。
三、自适应阈值二值化算法全局阈值二值化算法存在一个问题,即当图像的亮度不均匀时,选择一个固定的阈值就会导致一部分像素点被错误地分为黑色或白色。
为了解决这个问题,自适应阈值二值化算法被提出。
自适应阈值二值化算法的基本原理是根据图像的局部特征选择不同的阈值。
具体步骤如下:1. 将图像分割成若干个子区域;2. 对每个子区域计算一个局部阈值;3. 根据局部阈值将像素点分为两类,大于阈值的设为白色,小于等于阈值的设为黑色;4. 将二值化后的图像输出。
四、基于Otsu算法的二值化算法Otsu算法是一种自适应阈值二值化算法,其基本原理是通过最大类间方差来选择阈值。
具体步骤如下:1. 计算图像的灰度直方图;2. 遍历所有可能的阈值,计算每个阈值对应的类间方差;3. 选择使类间方差最大的阈值作为最终的二值化阈值;4. 根据阈值将像素点分为两类,大于阈值的设为白色,小于等于阈值的设为黑色;5. 将二值化后的图像输出。
五、C语言实现二值化算法的示例代码下面是一个使用C语言实现全局阈值二值化算法的示例代码:```c#include <stdio.h>void binaryzation(int threshold, int width, int height, unsigned char *input, unsigned char *output) {for (int i = 0; i < width * height; i++) {if (input[i] > threshold) {output[i] = 255;} else {output[i] = 0;}}}int main() {int threshold = 128; // 阈值int width = 640; // 图像宽度int height = 480; // 图像高度unsigned char input[width * height]; // 输入图像unsigned char output[width * height]; // 输出图像// 读取输入图像的灰度值// 调用二值化函数binaryzation(threshold, width, height, input, output);// 输出二值化后的图像return 0;}```六、总结本文介绍了C语言中常用的二值化算法及其实现原理。
BMP位图MFC单文档分割窗口显示和二值化
BMP位图文件的4个组成部分bmp文件大体上分成四个部分。
位图文件头BITMAPFILEHEADER 、位图信息头BITMAPINFOHEADER 、调色板Palette 、实际的位图数据ImageDate第1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为14个字节。
其定义如下:typedef struct tagBITMAPFILEHEADER{WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEH EADER;1.文件头信息块0000-0001 :文件标识,为字母ASCII码“BM”。
0002-0005 :文件大小。
0006-0009 :保留,每字节以“00”填写。
000A-000D :记录图像数据区的起始位置。
各字节的信息含义依次为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。
第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。
其定义如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize; 图像描述信息块的大小,常为28H。
LONG biWidth;LONG biHeight;WORD biPlanes; =1WORD biBitCount ; 记录像素的位数DWORD biCompression; 数据压缩方式DWORD biSizeImage; 图像区数据的大小LONG biXPelsPerMeter; 指定目标设备的水平分辨率,单位是像素/米LONG biYPelsPerMeter;DWORD biClrUsed; 位图实际用到的颜色数DWORD biClrImportant; 位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
c#实现图片二值化例子(黑白效果)
c#实现图⽚⼆值化例⼦(⿊⽩效果)C#将图⽚2值化⽰例代码,原图及⼆值化后的图⽚如下:原图:⼆值化后的图像:实现代码:using System;using System.Drawing;namespace BMP2Grey{class Program{static void ToGrey(Bitmap img1){for (int i = 0; i < img1.Width; i++){for (int j = 0; j < img1.Height; j++){Color pixelColor = img1.GetPixel(i, j);//计算灰度值int grey = (int)(0.299 * pixelColor.R + 0.587 * pixelColor.G + 0.114 * pixelColor.B);Color newColor = Color.FromArgb(grey, grey, grey);img1.SetPixel(i, j, newColor);}}}static void Thresholding(Bitmap img1){int[] histogram = new int[256];int minGrayValue=255, maxGrayValue=0;//求取直⽅图for (int i = 0; i < img1.Width; i++){for (int j = 0; j < img1.Height; j++){Color pixelColor = img1.GetPixel(i, j);histogram[pixelColor.R]++;if (pixelColor.R > maxGrayValue) maxGrayValue = pixelColor.R;if (pixelColor.R < minGrayValue) minGrayValue = pixelColor.R;}}//迭代计算阀值int threshold = -1;int newThreshold = (minGrayValue + maxGrayValue) / 2;for(int iterationTimes = 0; threshold != newThreshold && iterationTimes < 100; iterationTimes++){threshold = newThreshold;int lP1 =0;int lP2 =0;int lS1 = 0;int lS2 = 0;//求两个区域的灰度的平均值for (int i = minGrayValue;i < threshold;i++){lP1 += histogram[i] * i;lS1 += histogram[i];}int mean1GrayValue = (lP1 / lS1);for (int i = threshold+1;i < maxGrayValue;i++){lP2 += histogram[i] * i;lS2 += histogram[i];}int mean2GrayValue = (lP2 / lS2);newThreshold = (mean1GrayValue + mean2GrayValue) / 2;}//计算⼆值化for (int i = 0; i < img1.Width; i++){for (int j = 0; j < img1.Height; j++){Color pixelColor = img1.GetPixel(i, j);if (pixelColor.R > threshold) img1.SetPixel(i, j, Color.FromArgb(255, 255, 255)); else img1.SetPixel(i, j, Color.FromArgb(0, 0, 0));}}}static void Main(string[] args){try{//打开位图⽂件Bitmap img1 = new Bitmap("test.jpg", true);//灰度化ToGrey(img1);//⼆值化Thresholding(img1);//写回位图⽂件img1.Save("output.jpg");Console.WriteLine("Converted.");}catch (ArgumentException){Console.WriteLine("Invalid usage!");Console.WriteLine("Usage: bmp2grey source object");}}}}。
210.BMP彩色图像转化为灰度及二值图像
210.BMP彩⾊图像转化为灰度及⼆值图像1 概述 多媒体技术是⼀门综合了多种学科的新技术,其涉及到计算机科学与技术、通信和⽹络技术、⼈⼯智能技术、微电⼦技术、数字信号处理、图形处理技术、声像技术等诸多学科。
许多新技术的不断出现和体验,带给⼈们⼯作和⽣活巨⼤的改变。
其应⽤已经渗透到社会⽣活和⼯作的各个⽅⾯。
1.1背景 多媒体技术是20世纪80年代发展起来的⼀种新技术,是将⽂本、图形、图像、动画、声⾳、视频等信息通过计算机处理,形成⼈机交互作⽤的技术。
多媒体技术的发展同时也改变了计算机的使⽤领域,由仅仅限于专业办公领域扩展到各⾏各业,以及家庭⽣活和⼤众娱乐等⽅⽅⾯⾯。
很⼤程度上改善了我们的学习和⽣活。
随着计算机技术、⽹络通讯技术、电⼦信息等技术的快速发展,多媒体技术的应⽤和发展也⾯临着更⼤的机遇。
图1.1 多媒体技术与应⽤ 本课程多媒体技术与应⽤可分为多媒体实⽤技术和多媒体技术应⽤两⽅⾯,其中多媒体技术应⽤于⽣活、教学、艺术等⽅⾯,多媒体实⽤技术可分为基本概念、多媒体计算机系统、多媒体⾳频技术、多媒体视频技术、多媒体数据压缩技术、图像与图像处理技术、超⽂本与超媒体技术、多媒体应⽤系统设计、多媒体应⽤系统创作⼯具、多媒体应⽤程序设计、图形、图像设计技术、数字⾳频设计技术、数字视频设计技术⼏部分,本次课程选题为多媒体应⽤程序设计中的图形、图像设计技术,基于C语⾔实现BMP彩⾊图像转化为灰度及⼆值图像。
1.2设计的简要介绍 本次课程设计选题基于C语⾔实现⼀种BMP彩⾊图像转化为灰度及⼆值图像程序,属于多媒体实⽤技术中多媒体应⽤程序设计的⼀个分⽀,具体是⼀种图形、图像设计技术,选取BMP彩⾊数字图像作为实验⽬标,将其转化为灰度模式和⼆值模式。
本次课程设计将采⽤提出问题、分析问题、解决问题、验证与实验、总结的思路完成。
2 设计BMP⽂件因其“所见即所得”的特点,尽管⽂件⼤⼩⽐较⼤,但是位图⽂件的简单性、在微软视窗和其他地⽅的⼴泛使⽤以及这种格式的优秀⽂档标准以及没有专利约束,使得它成为其他操作系统图像处理程序能够读写的⼀种最为常⽤的格式。
图片的黑白处理(二值化)
图片的黑白处理(二值化)原始圖片黑白處理后圖片原始圖片:黑白處理后圖片:部分处理代码: code……Dim ts2 As IThresholder = New GlobalMeanThreshold(inbmp)Dim tsBMP As New Bitmap(PictureBox1.Width, PictureBox1.Height) ts2.RenderToBitmap(tsBMP)PictureBox6.Image = tsBMPPictureBox6.Height = PictureBox1.HeightPictureBox6.Width = PictureBox1.WidthPictureBox6.Left = 0PictureBox6.Top = 0……理论知识:灰度图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。
为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。
所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。
如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。
如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。
BMP图二进制转换
C#下将BMP转换成二进制是比较容易的,方法如下:Code:其实转换的结果是以8位二进制分割的十进制数(0~255),若是真要得到纯二进制,还需要进一步转换。
我曾做过很多实验,目的是测试这些数字和图片本身之间的关系,虽然学习过多媒体技术,但是对于详细的bmp分解,并没有太多认识。
当然,在实验前还要把“二进制”还原bmp的方法说明一下:Code:实验1:人为的变动bufPic数组中的前几个位置,得到的结果都是出错,没能正确的还原回bmp,仔细观察后在发现,几乎所有的bmp转换成的bufPIc的前几个位置都相同,所以得到一个猜测:bmp文件不是单一的由图片的像素组成,还有一些默认的统一的“约定”实验2:在试验1的基础上挨个尝试,找到变更后能正确还原bmp的位置,由这个位置来确定所谓的“约定”的位数。
得到的结论是42个。
猜测就是:每个bmp文件都有54个默认的参数。
实验3:进一步验证参数的个数是否正确。
更改54位以后的位置,看看结果对于图片的影响。
测试结果如下:用这个原图片,修改42位以后的若干位,结果是由此看来变动是相当大的,最明显的是由一个黑白图变为了彩色图,所以又有一个猜测:默认的参数不仅仅有54位,还包含一些控制调色板的位。
实验4: bufPIc中的每一个数字是否代表了bmp中每一个点的信息?答案当然是否定的,一个32*16的bmp中,有512个点,但bifPic中只有256个,还包括一些默认参数。
只能将数字转换成2进制来考虑,这也符合计算机的设计原理。
通过很多测试,最后得出了一些结论,参考了相关的资料并询问了导师,现总结如下:1. 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件结构可综合在表1中。
2 四个部分在位图图像数据中的相应位置,(位置偏移均以位图数据开始处为基准)起始位置偏移<=各部分数据具体存放位置<结束位置偏移第一部分,图像头:起始位置偏移 0,长度:0x0EH (2byte + 3 * dword = 14)结束位置偏移:起始位置偏移+长度第二部分,图像信息头:起始位置偏移:上一部分结束位置偏移长度:从 0x0EH 处读取到的 dword 的数据值结束位置偏移:起始位置偏移+长度第三部分,调色板:起始位置偏移:上一部分结束位置偏移长度:从 0x0AH 处读取到的 dword 的数据值-起始位置偏移结束位置偏移:起始位置偏移+长度第四部分,位图数据:起始位置偏移:上一部分结束位置偏移长度:从 0x22H 处读取到的 dword 的数据值结束位置偏移:文件结束3 单色位图图像数据的表示方法在单色位图图像中,只有两种颜色,黑色或白色,每一个像素只需要一个比特就能够完成表示,为了清楚比特0或1具体表示哪一种颜色,可以通过查询调色板。
C图片二值化处理位深度位深度
C#图片二值化处理(位深度→位深度)#region 二值化/*1位深度图像颜色表数组255个元素只有用前两个0对应0 1对应2551位深度图像每个像素占一位8位深度图像每个像素占一个字节是1位的8倍*//// <summary>/// 将源灰度图像二值化,并转化为1位二值图像。
/// </summary>/// <param name="bmp"> 源灰度图像。
</param>/// <returns> 1位二值图像。
</returns>public static Bitmap GTo2Bit(Bitmap bmp){if (bmp != null){// 将源图像内存区域锁定Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);// 获取图像参数int leng, offset_1bit = 0;int width = bmpData.Width;int height = bmpData.Height;int stride = bmpData.Stride; // 扫描线的宽度,比实际图片要大int offset = stride - width; // 显示宽度与扫描线宽度的间隙IntPtr ptr = bmpData.Scan0; // 获取bmpData的内存起始位置的指针int scanBytesLength = stride * height; // 用stride宽度,表示这是内存区域的大小if (width % 32 == 0){leng = width / 8;}else{leng = width / 8 + (4 - (width / 8 % 4));if (width % 8 != 0){offset_1bit = leng - width / 8;}else{offset_1bit = leng - width / 8;}}// 分别设置两个位置指针,指向源数组和目标数组int posScan = 0, posDst = 0;byte[] rgbValues = new byte[scanBytesLength]; // 为目标数组分配内存Marshal.Copy(ptr, rgbValues, 0, scanBytesLength); // 将图像数据拷贝到rgbValues中// 分配二值数组byte[] grayValues = new byte[leng * height]; // 不含未用空间。
基于c#图像灰度化、灰度反转、二值化的实现方法详解
基于c#图像灰度化、灰度反转、⼆值化的实现⽅法详解本篇⽂章是对c#图像灰度化、灰度反转、⼆值化的实现⽅法进⾏了详细的分析介绍,需要的朋友参考下图像灰度化:将彩⾊图像转化成为灰度图像的过程成为图像的灰度化处理。
彩⾊图像中的每个像素的颜⾊有R、G、B三个分量决定,⽽每个分量有255中值可取,这样⼀个像素点可以有1600 多万(255*255*255)的颜⾊的变化范围。
⽽灰度图像是R、G、B三个分量相同的⼀种特殊的彩⾊图像,其⼀个像素点的变化范围为255种,所以在数字图像处理种⼀般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少⼀些。
灰度图像的描述与彩⾊图像⼀样仍然反映了整幅图像的整体和局部的⾊度和亮度等级的分布和特征。
图像的灰度化处理可⽤两种⽅法来实现。
第⼀种⽅法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。
第⼆种⽅法是根据YUV的颜⾊空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜⾊空间的变化关系可建⽴亮度Y与R、G、B三个颜⾊分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。
///<summary>///图像灰度化///</summary>///<param name="bmp"></param>///<returns></returns>public static Bitmap ToGray(Bitmap bmp){for (int i = 0; i < bmp.Width; i++){for (int j = 0; j < bmp.Height; j++){//获取该点的像素的RGB的颜⾊Color color = bmp.GetPixel(i, j);//利⽤公式计算灰度值int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);Color newColor = Color.FromArgb(gray, gray, gray);bmp.SetPixel(i, j, newColor);}}return bmp;}灰度反转:把每个像素点的R、G、B三个分量的值0的设为255,255的设为0。
实验一bmp位图的读取、显示、放大缩小、二值化和反色
(数字图像处理)实验报告实验名称实验一bmp位图的读取、显示、放大缩小、二值化和反色实验时间专业班级学号姓名成绩教师评语:一、实验目的1、掌握windows BMP格式位图文件的基本格式。
会使用VC++读取图像数据并显示。
2、在读取BMP格式位图的的基础上增加对图像的放大、缩小、二值化和反色的功能。
二、实验内容1、在VC6.0环境下,生成MFC应用程序框架。
2、在已生成的应用程序中,加BMP位图读取与显示的代码,从已有文件中读取bmp格式文件并在视图中显示。
3、在生成的MFC应用程序框架下建立对应的消息响应函数,实现对已在视图中显示的图像的放大、缩小、二值化和反色的具体操作。
三、实验原理具体操作步骤及结果截图基本原理:BMP位图文件格式BMP位图文件中主要由4部分内容组成:1、文件头BITMAPFILEHEADER为一STRUCTURE:typedef struct tagBITMAPFILEHEADER {WORD bfType;//文件类型,必须为“BM”或0x424dDWORD bfSize;//文件大小WORD bfReserved1;//保留WORD bfReserved2;//保留DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;2、位图信息头BITMAPINFOHEADER,定义如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize;//structure sizeLONG biWidth;//image widthLONG biHeight;//image heightWORD biPlanes;//value is 1WORD biBitCount;//color bitsDWORD biCompression;//compression or notDWORD biSizeImage;//Imagesize=width*height( 其中width必须为4的倍数。
[指南]C图像二值化代码
C#图像二值化代码C#通过指针二值化、细化图像关于算法,主要用lockbits来读取位图,大概20ms左右完成二值化5000x5000pixels的bmp。
(E5200 @ 3GHz),相比之下最烂的getpixel 要10s以上二值化算法使用的是HSL色彩空间,通过H或L的阈值来完成复制内容到剪贴板代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;namespace Binary{public class CSunsafe{private System.Drawing.Bitmap curBitmap;private int[,] pic;private double Max(double a, double b){if (a > b){return a;}return b;}private double Min(double a, double b){if (a < b){return a;}return b;}private double RGB2H(double r, double g, double b){double h;r /= 255.0;g /= 255.0;b /= 255.0;double mi = this.Min(r, this.Min(g, b));double ma = this.Max(r, this.Max(g, b));h = 0;double del_max = ma - mi;if (del_max == 0.0)return 0.0;}double del_r = ((ma - (r / 6.0)) + (del_max / 2.0)) / del_max;double del_g = ((ma - (g / 6.0)) + (del_max / 2.0)) / del_max;double del_b = ((ma - (b / 6.0)) + (del_max / 2.0)) / del_max;if (r == ma){h = del_b - del_g;}else if (g == ma){h = (1.0/3.0 + del_r) - del_b;}else if (b == ma){h = (2.0/3.0 + del_g) - del_r;}if (h < 0.0){h++;}if (h > 1.0){h--;return h;}private double RGB2L(double r, double g, double b){r /= 255.0;g /= 255.0;b /= 255.0;double mi = this.Min(r, this.Min(g, b));return ((this.Max(r, this.Max(g, b)) + mi) / 2.0); }public void File_Init(string sFilename){if (sFilename != null){curBitmap =(Bitmap)Image.FromFile(sFilename);}}public void BMP_Init(Bitmap BMP){if (BMP != null){curBitmap = BMP;}}public int[,] Binary_L(double value){if (curBitmap != null){Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,curBitmap.PixelFormat);pic = new int[bmpData.Width, bmpData.Height];unsafe{byte* ptr = (byte*)(bmpData.Scan0);for (int i = 0; i < bmpData.Height; i++){for (int j = 0; j < bmpData.Width; j++){if (RGB2L(ptr[2], ptr[1], ptr[0]) < value){pic[j, i] = 1;}else{pic[j, i] = 0;}ptr += 3;}ptr += bmpData.Stride - bmpData.Width * 3;}}curBitmap.UnlockBits(bmpData);return pic;}else{return null;}}public int[,] Binary_H(double value){if (curBitmap != null){Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,curBitmap.PixelFormat);pic = new int [bmpData.Width,bmpData.Height];unsafe{byte* ptr = (byte*)(bmpData.Scan0);for (int i = 0; i < bmpData.Height; i++){for (int j = 0; j < bmpData.Width; j++){if (RGB2H(ptr[2], ptr[1], ptr[0]) < value){pic[j, i] = 1;}else{pic[j, i] = 0;}ptr += 3;}ptr += bmpData.Stride - bmpData.Width* 3;}}curBitmap.UnlockBits(bmpData);return pic;}else{return null;}}public int[,] ThiningPic(int[,] input){int[,] result = new int[input.GetLength(0), input.GetLength(1)];int lWidth = input.GetLength(0);int lHeight = input.GetLength(1);// Bitmap newBmp = new Bitmap(lWidth, lHeight); bool bModified; //脏标记int i, j, n, m; //循环变量Color pixel; //像素颜色值//四个条件bool bCondition1;bool bCondition2;bool bCondition3;bool bCondition4;int nCount; //计数器int[,] neighbour = new int[5, 5]; //5×5相邻区域像素值bModified = true;while (bModified){bModified = false;//由于使用5×5的结构元素,为防止越界,所以不处理外围的几行和几列像素for (j = 2; j < lHeight - 2; j++){for (i = 2; i < lWidth - 2; i++){bCondition1 = false;bCondition2 = false;bCondition3 = false;bCondition4 = false;if (input[i, j]==0){result[i, j] = 0;continue;}//获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表for (m = 0; m < 5; m++){for (n = 0; n < 5; n++){if (input[i + m - 2, j + n - 2] == 1) neighbour[m, n] = 1;if (input[i + m - 2, j + n - 2] == 1) neighbour[m, n] = 0;}}//逐个判断条件。
C语言实现BMP图像处理(直方图均衡化)
C语⾔实现BMP图像处理(直⽅图均衡化)本⽂实例为⼤家分享了C语⾔实现BMP图像直⽅图均衡化处理的具体代码,供⼤家参考,具体内容如下计算步骤:1)统计各灰度值的概率;2)计算了累积概率直⽅图(CDF);3)取整扩展:Tk = int[ (L-1)*Tk];#include <Windows.h>#include <stdlib.h>#include <stdio.h>#include <math.h>int main(int* argc, char** argv){FILE* fp = fopen("./01.bmp", "rb");if (fp == 0)return 0;BITMAPFILEHEADER fileHead;fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);BITMAPINFOHEADER infoHead;fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);int width = infoHead.biWidth;int height = infoHead.biHeight;int biCount = infoHead.biBitCount;int lineByte = (biCount*width / 8 + 3) / 4 * 4;RGBQUAD* pColorTable;pColorTable = new RGBQUAD[256];fread(pColorTable, sizeof(RGBQUAD), 256, fp);unsigned char* pBmpBuf;pBmpBuf = new unsigned char[lineByte*height];fread(pBmpBuf, lineByte*height, 1, fp);fclose(fp);// 统计概率double st[256] = { 0 };int st1[256] = { 0 };int t;for (int i = 0; i < height; ++i){for (int j = 0; j < width; ++j){t = *(pBmpBuf + i*lineByte + j);st[t]++;}}// 计算累加直⽅图并完成映射st[0] = st[0] / (width*height);st1[0] = round(double((256 - 1)*st[0]));for (int i = 1; i < 256; ++i){st[i] = st[i] / (width*height);st[i] = st[i] + st[i - 1];st1[i] = int(round(double((256 - 1)*st[i])));printf("st[i] = %d, st1[t] = %d\n", st[i], st1[i]);}// 新图像的像素填充unsigned char* pBmpBuf1;pBmpBuf1 = new unsigned char[lineByte*height];for (int i = 0; i < height; ++i){for (int j = 0; j < width; ++j){t = *(pBmpBuf + i*lineByte + j);*(pBmpBuf1 + i*lineByte + j) = st1[t];}}FILE* fop = fopen("./imhist.bmp", "wb");if (fop == 0)return 0;fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);fwrite(pColorTable, sizeof(RGBQUAD), 256, fop);fwrite(pBmpBuf1, lineByte*height, 1, fop);fclose(fop);system("pause");return 0;}实验结果:实验结果分析:对⽐原图与实验结果图,原图中,头发和⾐领处灰度值较低的地⽅在结果图中灰度值更低,⽽原图中,额头中间偏右处较亮,在结果图中更亮,灰度值更⼤。
C语言实现对图像的二值化
C语⾔实现对图像的⼆值化/************************************************************************** 该函数⽤于对图像进⾏阈值分割运算* 参数:* LPSTR lpDIBBits - 指向源DIB图像指针* LONG lWidth - 源图像宽度(象素数)* LONG lHeight - 源图像⾼度(象素数)************************************************************************/BOOL ImageChangeProc::ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight){// 指向源图像的指针LPSTR lpSrc;// 指向缓存图像的指针LPSTR lpDst;// 指向缓存DIB图像的指针LPSTR lpNewDIBBits;HLOCAL hNewDIBBits;//循环变量long i;long j;unsigned char pixel;long lHistogram[256];//阈值,最⼤灰度值与最⼩灰度值,两个区域的平均灰度值unsigned char Threshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue; //⽤于计算区域灰度平均值的中间变量long lP1,lP2,lS1,lS2;//迭代次数int IterationTimes;LONG lLineBytes;hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);if (hNewDIBBits == NULL){// 分配内存失败return FALSE;}// 锁定内存lpNewDIBBits = (char * )LocalLock(hNewDIBBits);// 初始化新分配的内存lpDst = (char *)lpNewDIBBits;memset(lpDst, (BYTE)255, lWidth * lHeight);lLineBytes = WIDTHBYTES(lWidth * 8);for (i = 0; i < 256;i++){lHistogram[i]=0;}//获得直⽅图MaxGrayValue = 0;MinGrayValue = 255;for (i = 0;i < lWidth ;i++)for(j = 0;j < lHeight ;j++){lpSrc = (char *)lpDIBBits + lLineBytes * j + i;pixel = (unsigned char)*lpSrc;lHistogram[pixel]++;//修改最⼤,最⼩灰度值if(MinGrayValue > pixel){MinGrayValue = pixel;}if(MaxGrayValue < pixel){MaxGrayValue = pixel;}}}//迭代求最佳阈值NewThreshold = (MinGrayValue + MaxGrayValue)/2;Threshold = 0;for(IterationTimes = 0; Threshold != NewThreshold && IterationTimes < 1000;IterationTimes ++) {Threshold = NewThreshold;lP1 =0;lP2 =0;lS1 = 0;lS2 = 0;//求两个区域的灰度平均值for (i = MinGrayValue;i <=Threshold;i++){lP1 += lHistogram[i]*i;lS1 += lHistogram[i];}for (i = Threshold+1;i<MaxGrayValue;i++){lP2 += lHistogram[i]*i;lS2 += lHistogram[i];}if(lS1==0||lS2==0){// 释放内存LocalUnlock(hNewDIBBits);LocalFree(hNewDIBBits);return FALSE;}Temp1GrayValue = (unsigned char)(lP1 / lS1);Temp2GrayValue = (unsigned char)(lP2 / lS2);NewThreshold = (Temp1GrayValue + Temp2GrayValue)/2;}//根据阈值将图像⼆值化for (i = 0;i < lWidth ;i++){for(j = 0;j < lHeight ;j++){lpSrc = (char *)lpDIBBits + lLineBytes * j + i;lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;pixel = (unsigned char)*lpSrc;if(pixel <= Threshold){*lpDst = (unsigned char)0;}{*lpDst = (unsigned char)255;}}}// 复制图像memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight); // 释放内存LocalUnlock(hNewDIBBits);LocalFree(hNewDIBBits);// 返回return TRUE;}。
C#图片转二进制
C#图⽚转⼆进制///<summary>///将⽬标路径转为image///</summary>///<param name="path">图⽚路径</param>///<returns></returns>public Image LoadImage(string path){//创建⼀个bitmap类型的bmp变量来读取⽂件。
Bitmap bmp = new Bitmap(path);//新建第⼆个bitmap类型的bmp2变量,我这⾥是根据我的程序需要设置的。
Bitmap bmp2 = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format16bppRgb555);//将第⼀个bmp拷贝到bmp2中Graphics draw = Graphics.FromImage(bmp2);draw.DrawImage(bmp, 0, 0);draw.Dispose();bmp.Dispose();//释放bmp⽂件资源return (Image)bmp2;}///<summary>///将图⽚转为⼆进制///</summary>///<param name="img">图⽚</param>///<returns></returns>public byte[] GetByteImage(Image img){byte[] bt = null;if (!img.Equals(null)){using (MemoryStream mostream = new MemoryStream()){Bitmap bmp = new Bitmap(img);bmp.Save(mostream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图像以指定的格式存⼊缓存内存流 bt = new byte[mostream.Length];mostream.Position = 0;//设置留的初始位置mostream.Read(bt, 0, Convert.ToInt32(bt.Length));}}return bt;}。
C#指针操作图像二值化处理
C#指针操作图像⼆值化处理///<summary>///⼆值化图像///</summary>///<param name="bmp"></param>///<returns></returns>private static unsafe Bitmap Binaryzation(Bitmap bmp){BitmapData dstData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);byte* data = (byte*)(dstData.Scan0);//将图像转换为0,1⼆值得图像;int step = dstData.Stride;int means = getThreshold(data, bmp.Height * step);for (int y = 0; y < bmp.Height; y++){for (int x = 0; x < bmp.Width * 3; x += 3){if (data[y * step + x + 2] > means)data[y * step + x]= data[y * step + x + 1]= data[y * step + x + 2]= 255;elsedata[y * step + x]= data[y * step + x + 1]= data[y * step + x + 2]= 0;}}bmp.UnlockBits(dstData);return bmp;}///<summary>///图像⼆值化获取阀值///</summary>///<param name="inPixels"></param>///<param name="length">height * Stride</param>///<returns></returns>private static unsafe int getThreshold(byte* inPixels, int length){int inithreshold = 127;int finalthreshold = 0;List<int> temp = new List<int>();for (int index = 0; index < length; index += 3){temp.Add(inPixels[index + 2]);}List<int> sub1 = new List<int>();List<int> sub2 = new List<int>();int means1 = 0, means2 = 0;while (finalthreshold != inithreshold){finalthreshold = inithreshold;for (int i = 0; i < temp.Count(); i++){if (temp[i] <= inithreshold){sub1.Add(temp[i]);}else{sub2.Add(temp[i]);}}means1 = getMeans(sub1);means2 = getMeans(sub2);sub1.Clear();sub2.Clear();inithreshold = (means1 + means2) / 2;}return finalthreshold;}///<summary>///图像⼆值化获取Means///</summary>///<param name="data"></param>///<returns></returns>private static int getMeans(List<int> data){int result = 0;int size = data.Count();foreach (int i in data) {result += i;}return (result / size); }。
基于VC的BMP图像二值化处理平台
中北大学课程设计说明书学生姓名:学号:学生姓名:学号:学生姓名:学号:学院:专业:电子信息工程题目:专用基本技能实践:基于VC的BMP图像二值化处理平台指导教师:陈平职称: 副教授2013 年 10 月 28 日中北大学课程设计任务书13/14 学年第一学期学院:专业:学生姓名:学号:学生姓名:学号:学生姓名:学号:课程设计题目:专用基本技能实践:基于VC的BMP图像二值化处理平台起迄日期:2013年10月28 日~2013年11月17日课程设计地点:指导教师:陈平系主任:下达任务书日期: 2013 年10月28日设计说明书应包括以下主要内容:(正文小四宋体,行距1.5倍,标题四号宋体,加粗)(1)封面:课程设计题目、班级、姓名、指导教师、时间(2)设计任务书前面提供内容即为上述两项,参考文献请大家自己填写,必须为大家相关书目。
(3)目录(页码从下一项开始加)(4)设计目的简介(5)设计主要方案及理论介绍(很重要)(6)设计主要步骤(编程过程中间请同学抓屏,做为这里每步要做的内容,并且加文字描述)(7)程序源代码(8)运行结果(9)设计评述,设计者对本设计的评述及通过设计的收获体会(10)参考文献(这里可以与上面任务书中相同)附件:参考文献格式学术期刊作者﹒论文题目﹒期刊名称,出版年份,卷(期):页次如果作者的人数多于3人,则写前三位作者的名字后面加“等”,作者之间以逗号隔开。
例如:[1]李峰,胡征,景苏等. 纳米粒子的控制生长和自组装研究进展. 无机化学学报,2001, 17(3): 315~324[2]J.Y.Li, X.L.Chen,H.Li. Fabrication of zinc oxide nanorods.Journal of Crystal Growth, 2001,233:5~7学术会议论文集作者﹒论文题目﹒文集编者姓名﹒学术会议文集名称,出版地:出版者,出版年份:页次例如:[3] 司宗国,谢去病,王群﹒重子湮没快度关联的研究﹒见赵维勤,高崇寿编﹒第五届高能粒子产生和重离子碰撞理论研讨会文集,北京:中国高等科学技术中心,1996:105图书著者﹒书名﹒版本﹒出版地:出版者,出版年﹒页次如果该书是第一版则可以略去版次。
C#实现把图片转换成二进制以及把二进制转换成图片的方法示例
C#实现把图⽚转换成⼆进制以及把⼆进制转换成图⽚的⽅法⽰例本⽂实例讲述了C#实现把图⽚转换成⼆进制以及把⼆进制转换成图⽚的⽅法。
分享给⼤家供⼤家参考,具体如下:private void button1_Click(object sender, EventArgs e){string path = this.textBox1.Text;byte[] imgBytesIn = SaveImage(path);ShowImgByByte(imgBytesIn);//Parameters.Add("@Photo", SqlDbType.Binary).Value = imgBytesIn;}//将图⽚以⼆进制流public byte[] SaveImage(String path){FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); //将图⽚以⽂件流的形式进⾏保存BinaryReader br = new BinaryReader(fs);byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //将流读⼊到字节数组中return imgBytesIn;}//现实⼆进制流代表的图⽚public void ShowImgByByte(byte[] imgBytesIn){MemoryStream ms = new MemoryStream(imgBytesIn);pictureBox1.Image = Image.FromStream(ms);}⼆、将图⽚保存到数据库中,并从数据库中读取:#region 将图⽚从数据库中读取/// <summary>/// 将图⽚从数据库中读取/// </summary>/// <param name="xs_ID">要读取图⽚的学号</param>/// <param name="ph">pictureBox1控件名</param>public void get_photo(string xs_ID, PictureBox ph)//将图⽚从数据库中读取{byte[] imagebytes = null;getcon();SqlCommand con = new SqlCommand("select * from S_jiben where S_num='" + xs_ID + "'", link);SqlDataReader dr = con.ExecuteReader();while (dr.Read()){imagebytes =(byte[])dr.GetValue(18);}dr.Close();con_close();MemoryStream ms = new MemoryStream(imagebytes);Bitmap bmpt = new Bitmap(ms);ph.Image = bmpt;}#endregion#regionpublic void SaveImage(string MID, OpenFileDialog openF)//将图⽚以⼆进制存⼊数据库中{string strimg = openF.FileName.ToString(); //记录图⽚的所在路径FileStream fs = new FileStream(strimg, FileMode.Open, FileAccess.Read); //将图⽚以⽂件流的形式进⾏保存BinaryReader br = new BinaryReader(fs);byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //将流读⼊到字节数组中getcon();StringBuilder strSql = new StringBuilder();strSql.Append("update S_jiben Set xs_photo=@Photo where S_num=" + MID);SqlCommand cmd = new SqlCommand(strSql.ToString(), link);cmd.Parameters.Add("@Photo", SqlDbType.Binary).Value = imgBytesIn;cmd.ExecuteNonQuery();con_close();}#endregion更多关于C#相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家C#程序设计有所帮助。
bmp位图的点运算包括二值化反色和对数运算
实验二、bmp位图的点运算一、实验目的实验目的:理解图像的象素操作。
理解二值化与反色的本质。
二、实验步骤及内容1、根据实验一的结果,VC6.0开发环境下的资源编辑器中,在主菜单下添加一名为“点运算”的菜单。
并添加两个分别名为“二值化”与“反色”和“对数”的子菜单项。
分别给它们名为“ID_erzhihua”、“ID_fanse”,“ID_duishu”的ID。
2、打开classwizard,分别为下述两菜单项加入相应的消息映射函数。
3、在函数体中加入二值化和反色的实现代码。
4、在两函数体最后加入更新视图的函数:Invalid(1)二值化函数:void CZyf125View::Onerzhihua(){// TODO: Add your command handler code herelong w,h;long i,j;w=m_DibHead->biWidth;h=m_DibHead->biHeight;unsigned char temp(0);for(i=0;i<h;i++)for(j=0;j<w;j++){temp=*(m_Image+i*w+j);if(temp>50)*(m_Image+i*w+j)=255;else*(m_Image+i*w+j)=0;}Invalidate();}图像效果:(2)反色函数:void CZyf125View::Onfanse(){// TODO: Add your command handler code herelong w,h;long i,j;w=m_DibHead->biWidth;h=m_DibHead->biHeight;unsigned char temp(0);for(i=0;i<h;i++)for(j=0;j<w;j++){*(m_Image+i*w+j)=255-*(m_Image+i*w+j);}Invalidate();}反色效果:void CZyf125View::Onfanse(){// TODO: Add your command handler code herelong w,h;long i,j;w=m_DibHead->biWidth;h=m_DibHead->biHeight;unsigned char temp(0);for(i=0;i<h;i++)for(j=0;j<w;j++){*(m_Image+i*w+j)=255-*(m_Image+i*w+j);}Invalidate();}(3)对数函数:void CZyf125View::Onduishu(){// TODO: Add your command handler code herelong i,j;long w,h;w=m_DibHead->biWidth;h=m_DibHead->biHeight;float c=500.0;for(i=0;i<h;i++)for(j=0;j<w;j++)*(m_Image+i*w+j)=c*log10(*(m_Image+i*w+j)+1.0);Invalidate();}对数后效果:。
BMP图片转BIN 2进制
绝对能用VC6编译适合嵌入式图片转2进制或者WINDOWS上#include <stdio.h>#define BMP_SIZEH 240#define BMP_SIZEV 320#define uchar unsigned char#define uint unsigned intFILE *fpr, *fpw_bin;uint colorArray[BMP_SIZEV][BMP_SIZEH];typedef struct {uchar blue;uchar green;uchar red;} BMP_color;typedef struct {uchar color_H;uchar color_L;} TFT_color;typedef struct {uint H;uint V;} BMP_size;char* numberToBmpName(int num, char* bmpName, char* file) {int i = 0;if((num<1000)&&(num>=0)) {*(bmpName+0) = num/100 + 0x30;*(bmpName+1) = num/10%10 + 0x30;*(bmpName+2) = num%10 + 0x30;while(*(file+i) != '\0') {*(bmpName+3+i) = *(file+i);i++;}*(bmpName+3+i) = *(file+i);return bmpName;} else {return NULL;}}char* hexToString(char *str, uchar hexNum) {uchar i, j;*(str+0) = '0';*(str+1) = 'x';i = hexNum & 0x0f;j = (hexNum>>4) & 0x0f;switch(j) {case 0x00 :*(str+2) = '0';break;case 0x01 :*(str+2) = '1';break;case 0x02 :*(str+2) = '2';break;case 0x03 :*(str+2) = '3';break;case 0x04 :*(str+2) = '4';break;case 0x05 :*(str+2) = '5';break;case 0x06 :*(str+2) = '6';break;case 0x07 :*(str+2) = '7';break;case 0x08 :*(str+2) = '8';break;case 0x09 :*(str+2) = '9';break;case 0x0a :*(str+2) = 'a';break;case 0x0b :*(str+2) = 'b';break;case 0x0c :*(str+2) = 'c';break;case 0x0d :*(str+2) = 'd';break;case 0x0e :*(str+2) = 'e';break;case 0x0f :*(str+2) = 'f';break;}switch(i) {case 0x00 :*(str+3) = '0';break;case 0x01 :*(str+3) = '1';break;case 0x02 :*(str+3) = '2';break;case 0x03 :*(str+3) = '3';break;case 0x04 :*(str+3) = '4';break;case 0x05 :*(str+3) = '5';break;case 0x06 :*(str+3) = '6';break;case 0x07 :*(str+3) = '7';break;case 0x08 :*(str+3) = '8';break;case 0x09 :*(str+3) = '9';break;case 0x0a :*(str+3) = 'a';break;case 0x0b :*(str+3) = 'b';break;case 0x0c :*(str+3) = 'c';break;case 0x0d :*(str+3) = 'd';break;case 0x0e :*(str+3) = 'e';break;case 0x0f :*(str+3) = 'f';break;}*(str+4) = ',';*(str+5) = '\0';return str;}BMP_color BMP_DAT;int main(){TFT_color BIN_DAT;BMP_size sizeBMP;uchar c;int ch;uint picAdd = 0;uint picDat = 0;uint i;uint color_tmp;uchar sizeTemp[4];uint j;uint zoneNum;char fileName[8];uint bmpNum;bmpNum = 0;color_tmp = 0;while( (fpr = fopen(numberToBmpName(bmpNum, fileName, ".bmp"), "rb")) != NULL) { j = 0;i = 0;fpw_bin = fopen(numberToBmpName(bmpNum, fileName, ".bin"), "wb+");printf(numberToBmpName(bmpNum, fileName, ".bmp"));printf(" is decoding..\n");while(i<18) {c=fgetc(fpr);i++;}sizeTemp[0]=fgetc(fpr);sizeTemp[1]=fgetc(fpr);sizeTemp[2]=fgetc(fpr);sizeTemp[3]=fgetc(fpr);sizeBMP.H = sizeTemp[3];sizeBMP.H = (sizeBMP.H<<8) + sizeTemp[2];sizeBMP.H = (sizeBMP.H<<8) + sizeTemp[1];sizeBMP.H = (sizeBMP.H<<8) + sizeTemp[0];sizeTemp[0]=fgetc(fpr);sizeTemp[1]=fgetc(fpr);sizeTemp[2]=fgetc(fpr);sizeTemp[3]=fgetc(fpr);sizeBMP.V = sizeTemp[3];sizeBMP.V = (sizeBMP.V<<8) + sizeTemp[2];sizeBMP.V = (sizeBMP.V<<8) + sizeTemp[1];sizeBMP.V = (sizeBMP.V<<8) + sizeTemp[0];i = i + 8;while(i<54) {c=fgetc(fpr);i++;}for(j=0; j<sizeBMP.V; j++){for(i=0; i<sizeBMP.H; i++){BMP_DAT.blue = fgetc(fpr);BMP_DAT.green = fgetc(fpr);BMP_DAT.red = fgetc(fpr);color_tmp = BMP_DAT.red>>3;color_tmp = (BMP_DAT.green>>2)|(color_tmp<<6);color_tmp = (BMP_DAT.blue>>3)|(color_tmp<<5);colorArray[i][j] = color_tmp;}if(sizeBMP.H%4){for(i=0; i<(4-sizeBMP.H%4); i++){fgetc(fpr);}}}for(i=0; i<sizeBMP.H; i++){for(j=0; j<sizeBMP.V; j++){BIN_DAT.color_L = colorArray[i][j];BIN_DAT.color_H = colorArray[i][j]>>8;fputc(BIN_DAT.color_L, fpw_bin);fputc(BIN_DAT.color_H, fpw_bin);}}fclose(fpr);fclose(fpw_bin);bmpNum++;}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int bitmapToGray(char *OriginalBMP,char *ResultBMP);
int main()
{
bitmapToGray("E:\\xljFile\\pictureProcessing\\LONGJIANG.bmp",
"E:\\xljFile\\pictureProcessing\\LONGJIANG2.bmp");
BMP8Image=(unsigned char*)calloc(1000*1000,sizeof(unsigned char));
if((f=fopen(OriginalBMP,"rb"))==NULL)
{
printf("open %s error,please check\n");
}
fh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
// +sizeof(RGBQUAD)*256;
fread(&ih,sizeof(BITMAPINFOHEADER),1,f);
return 0;
}
int bitmapToGray(char *OriginalBMP,char *ResultBMP)
{
unsigned char *BMP24Image,*BMP8Image;
BITMAPFILEHEADER fh;
BITMAPINFOHEADER ih;
// RGBQUAD Color[256];
// BYTE CTemp[3]; //颜色分量
int Row,Col,nCol;
int i,j,k;
FILE *f,*p;
BMP24Image=(unsigned char*)calloc(2000*2000,sizeof(unsigned char));
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <malloc.h>
# include <ctype.h>
# include <process.h>
# include <windows.h>
return 0;
}
fread(&fh,sizeof(BITMAPFILEHEADER),1,f);
if(fh.bfType!='MB')
{
\n");
return 0;
{
printf("open savefile error\n");
return 0;
}
// for(i=0;i<256;i++) //调色板
// {
// Color[i].rgbBlue=i;
else BMP8Image[i*Col+j]=100;
// for(k=0;k<3;k++)
// {
// CTemp[k]=BMP24Image[i*nCol+j*3+k];
// }
// BMP8Image[i*Col+j]=CTemp[2]*0.299+CTemp[1]*0.587+CTemp[0]*0.114;//转化公式
}
}
fclose(f);
if((p=fopen(ResultBMP,"wb"))==NULL)
// Color[i].rgbGreen=i;
// Color[i].rgbRed=i;
// Color[i].rgbReserved=0;
// }
fwrite(&fh,sizeof(BITMAPFILEHEADER),1,p);
fwrite(&ih,sizeof(BITMAPINFOHEADER),1,p);
Row=ih.biHeight;
Col=ih.biWidth;
Col=Col/4*4;
// nCol=Col*4/4*4; //扫描宽度
ih.biBitCount=8; //改变像素位数大小,8位,256色
fread(BMP24Image,sizeof(unsigned char),Row*Col,f);
//fwrite(Color,sizeof(RGBQUAD),256,p);
fwrite(BMP8Image,sizeof(unsigned char),Row*Col,p);
fclose(p);
return 0;
}
for(i=0;i<Row;i++)
{ for(j=0;j<Col;j++)
{
if(BMP24Image[i*Col+j]>128)
BMP8Image[i*Col+j]=255;