通过操作BMP文件的RGB值实现BMP文件的旋转,锐化,二值化,轮廓提取,边缘检测,合并等功能(一)

本文介绍了作者初涉C++ MFC开发,通过学习实现BMP文件的旋转、锐化、二值化、轮廓提取和边缘检测等特效处理。文章首先讲解了计算机存储的基本概念,如Bit、Byte、Word、DWORD和RGB,接着介绍了Bitmap的相关知识,包括DIB、DDB、BMP文件结构。最后,文章描述了如何解析和处理BMP文件,使用SetDIBitsToDevice函数,并展示了打开BMP文件的代码片段。
摘要由CSDN通过智能技术生成

本人之前没写过什么代码,只是简单地做过几个Android App,都是自己写着玩,连码农都算不上,代码功底说实话不怎么地。最近公司说可以让做开发,不过是C++,MFC方面。C++我不怎么懂,MFC更是不怎么熟悉。开始做个BMP文件显示特效处理的小程序,虽然不怎么懂,也只能边学编写了。由于水平有限,代码里很多地方会不入高手法眼,不喜勿喷,新手学习经验记录笔记而已。

就当自己是什么都不懂,就把觉得应该记录的地方即下来吧。如有不对的地方,请指正。

一.计算机存储相关的概念:

1.1 Bit(位):计算机中最小的存储单位,就是二进制中的0或者1, 1 Bit就是一个0或者一个1

1.2 Byte(字节):比Bit稍大点的单位,1 Byte = 8 Bit

1.3 WORD(字):MSDN中解释为16 Bit的整数,即1 Word = 2 Byte但这个似硬件相关,数据总线为16位,则1word为2byte;32位时,1word为4byte

1.4 DWORD(双字):就是2个字的大小了,1 DWORD = 2 WORD = 4 Byte = 32 Bit

1.5 RGB:简单理解就是红绿蓝三种颜色,一般情况下用3个字节表示,即R占8 Bit,G占8 Bit,B占8 Bit,每个RGB的范围是0-255,当然这只是RGB的一种表现形式, 还有RGB555, RGB565等其他形式,先记成各占8 Bit便于理解。

二.Bitmap的相关概念

2.1 简单概念:常见的BMP文件有单色,16色,256色,24位,32位的bmp文件。为什么会有这些差异呢?因为早期系统和硬件设备表示颜色的能力有限,同时也是为了节约存储空间的成本,所以才会有了这些差异。简单理解为单色,16色,256色表示的颜色如字面意思,即有2种颜色,16种颜色,256种颜色的bmp,至于24 Bit和32 Bit的可以标示2^24和2^32种颜色。24位位图一个像素是24位,刚好是一个字节代表一个RGB分量。32位位图4个字节代表一个像素,相比24位位图,它多了一个Alpha通道,在最高位,表示图像的透明度,不过目前还没用到过这个值。

2.2 DIB和DDB:(本人的理解)DIB是和显示设备无关的Bmp文件,因为在它的文件中存储了各种颜色的表示方式。而DDB是和显示设备相关的bmp文件,系统在显示它时,会依赖于在系统中当前选中的调色板(有多少种颜色),至于系统中调色板的表示能力是多少,这个就有差异了,所以一般使用的DIB方式的存储的bmp文件。

2.3 BMP文件结构:想象一个BMP文件在内存中总共占一堆空间,按照标准,把这对内存空间又划分成几个不同的部分。把这段内存想象为自上而下的结构,那么BMP文件在内存中可以分为以下几个部分:

BITMAPFILEHEADER

typedef struct tagBITMAPFILEHEADER { 
  WORD    bfType; //占2个字节(1个WORD),二进制读BMP文件时,头两个字节的值应该是0x424D,即字符'BM',这个值是固定的
  DWORD   bfSize; //占4个字节(1个DWORD),读取这四个字节的内容就是代表着BMP文件的大小,用Byte表示
  WORD    bfReserved1; //保留位,占1个字节,值总是0
  WORD    bfReserved2; //保留位,占1个字节,值总是0
  DWORD   bfOffBits; //4个字节,表示BITMAPINFOHEADER,RGBQUAD,Color-Index array的内存起始地址
}

BITMAPINFOHEADER

typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize; //4个字节,二进制读取此4个字节的内容就是biSize,一般情况下这个值是40,但是有些特殊的bmp文件不是40,不知道为什么
  LONG   biWidth; //4个字节,图像的宽度,单位是像素,即一行有多少个像素点
  LONG   biHeight; //4个字节,图像的高度,单位是像素,一列有多宽 
  WORD   biPlanes; //2个字节,这个值总是1
  WORD   biBitCount; //2个字节,这个值很重要,这个值可能为1,4,8,16,24,32。表示bmp文件中颜色的个数,即有2^biBitCount个颜色,也就是说有2中颜色(单色,黑白)
                     //16色,256色位图,16位位图,24位位图,32位位图。一般说来,单色,16色,256色位图中都会有调色板。16位位图可能会有调色板,这个值和
                     //biCompression,biClrUsed合起来会有不同的RGB的表示方式,这个就比较特殊了,没具体研究过
 DWORD  biCompression; //bmp文件的压缩方式,一般用BI_RGB(值是0)表示不压缩,如果是其他值,表示不同的压缩方式,这个也没仔细研究了
  DWORD  biSizeImage; //文件大小
  LONG   biXPelsPerMeter; //表示每米有多少像素,水平方向,没怎么用,不知道有什么用途
  LONG   biYPelsPerMeter; //类似上一个,不过是垂直方向
  DWORD  biClrUsed; //表示调色板中或者图片中使用的颜色的数目,一般是0,似乎不需要关注
  DWORD  biClrImportant; //表示显示这个bmp需要多少种颜色,一般是0,表示所有颜色都需要,即所有颜色都很重要,似乎也不需要特别关注
}
一般情况下,只需要关注,biSzie, biWidth, biHeight, biBitCount, biCompression这几个值

RGBQUAD

typedef struct tagRGBQUAD {
  BYTE    rgbBlue; 
  BYTE    rgbGreen; 
  BYTE    rgbRed; 
  BYTE    rgbReserved; 
}
这个就是调色板,一般是16位位图以下才有,在bmp文件中,调色板是一个数组,里面存储了不同颜色的RGB值,可以把它想象成画图板的调色板就就可以了。

Color-Index

### 回答1: bmp图像锐化是一种通过增强图像中的细节和边缘来改善图像清晰度的技术。下面是一个简单的方法来实现bmp图像的锐化。 首先,我们需要加载bmp图像,并将其转换为灰度图像以便于处理。然后,我们可以应用一个锐化滤波器来增强图像的边缘信息。一种常用的锐化滤波器是拉普拉斯滤波器。 拉普拉斯滤波器是一个3x3的矩阵,其中心为8,周围的为-1。我们需要在整个图像上应用该滤波器。具体地,我们将滤波器矩阵与图像中的每个像素相乘,然后将乘积求和,最后将结果赋给目标图像的对应像素。 在应用滤波器之后,我们还可以使用一个调整参数来增加图像的锐化效果。调整参数可以控制图像中的高频信息的强度。通过增加调整参数的,图像中的边缘和细节会变得更加明显。 最后,我们将锐化后的图像保存为一个新的bmp文件,并显示出来供用户观察。 这是一个简单的方法来实现bmp图像的锐化。当然,还有很多其他的方法和算法可以用于图像锐化,例如使用卷积神经网络等高级技术。 ### 回答2: 要将bmp图像进行锐化,可以使用不同的算法和技术来增强图像的边缘和细节。以下是一种可能的方法: 1. 读取bmp图像:首先需要从文件中读取bmp图像数据,包括宽度、高度和像素。 2. 灰度化处理:将彩色图像转换为灰度图像,可以通过将每个像素的红、绿、蓝分量的加权平均作为灰度实现。 3. 应用锐化算法:常用的锐化算法是拉普拉斯算子,它可以通过应用一个特定的卷积核来增强图像的边缘。对于每个像素,将其与周围像素进行卷积运算,并将结果作为锐化后的像素。这样可以提高图像的清晰度和边缘的明确性。 4. 调整对比度和亮度:锐化后的图像可能出现对比度和亮度不均匀的问题。可以通过调整图像的亮度和对比度来改善图像的视觉效果。可以使用简单的线性拉伸或非线性变换来实现,例如使用伽马校正来增加对比度。 5. 保存图像:完成锐化处理后,将结果保存为新的bmp图像文件,以便进一步使用或显示。 需要注意的是,锐化处理有时可能导致图像出现噪点或锯齿状边缘。为了减少这些不良效果,可以在锐化处理前后应用平滑滤波器或边缘保护滤波器来平衡图像的细节和噪点。 ### 回答3: 要对 BMP 图像进行锐化处理,可以使用一些图像处理算法来提高图像的清晰度和细节。下面是一种常见的基于卷积的锐化算法的步骤: 1. 首先,将 BMP 图像转换为二维灰度图像,即将 RGB 转化为灰度级。 2. 然后,为了处理图像边界像素,可以对图像进行边界扩展。边界扩展的方法可以选择复制边界像素,或者使用零填充。 3. 接下来,定义一个锐化滤波器。常用的锐化滤波器是拉普拉斯(Laplacian)滤波器。通过将图像与拉普拉斯滤波器进行卷积运算,可以增强图像的高频细节。 4. 将拉普拉斯滤波器应用于图像,通过卷积运算,计算滤波器与图像各个像素的互相关结果。 5. 将卷积结果与原始图像进行相加操作,得到锐化后的图像。这一步是为了将原始图像的低频分量与滤波器处理后的高频分量相结合,从而增强图像的细节信息。 6. 最后,将处理后的图像保存为 BMP 格式。 这是一种基本的图像锐化方法,可以针对具体的应用和需求进行调整和改进。通过使用不同的滤波器和参数,可以获得不同程度的锐化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值