最近在上付老师数字图像处理的课程,应老师要求进行使用基于MFC对数字图像处理的各种方法的实现,这里对自己的实现方法进行一段简单的记录》
首先MFC导入的图片是BMP格式,详细环境搭建参考付老师的文章:
02. 基于MFC读取并显示一幅BMP图像_mfc 显示bmp-CSDN博客
环境搭建好以后,我们就可以写封装实现图像处理的函数了。
由于传入的参数基本一至,且每个图像处理单独封装,这里直接介绍每个函数要传入的变量,如果不理解还请参考上述付老师的文章。
CDC* pDC //画板
unsigned char* img_data //原始图像存储
int bmpWidth //图片的宽度(基于分辨率)
int bmpHeight //图片的高度(基于分辨率)
int lineByte //遍历图片每一行的总字节数
int offset_left //要绘制图片的起始位置X(相较于MFC左上角)
int offset_top //要绘制图片的起始位置Y(相较于MFC左上角)
//灰度原图
void Grey(CDC* pDC, unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte, int offset_left, int offset_top)
{
unsigned int bluce = 0; //图像灰度化
unsigned char* img_line = img_data;
for (int i = 0; i < bmpHeight; i++)
{
for (int k = 0; k < bmpWidth; k++)
{
bluce = 0.3 * img_line[3 * k + 2] + 0.59 * img_line[3 * k + 1] + 0.11 * img_line[3 * k + 0];
pDC->SetPixel(k + offset_left, 2 * bmpHeight + 1 - i + offset_top, RGB(bluce, bluce, bluce));
}
img_line += lineByte;
}
}
由于我们保存的图片数组是将该像素点的R,G,B三原色值保存,定义一个int类型的数值存放0~255的256级灰度图。灰度值算法采用F = (0.3 * B +0.59 * G + 0.11 * R)得到当前像素点的灰度值。
然后将图像绘制在MFC框架结果上。
原始图像: 灰度原始图:
取反处理:
将图片0~255的像素值用255减当前像素值:
//取反处理
void Opposite(CDC* pDC, unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte, int offset_left, int offset_top)
{
unsigned char red, green, blue = 0;
unsigned char* img_line = img_data;
for (int i = 0; i < bmpHeight; i++)
{
for (int k = 0; k < bmpWidth; k++)
{
//取反处理
blue = 255 - img_line[3 * k + 0] - 1;
green = 255 - img_line[3 * k + 1] - 1;
red = 255 - img_line[3 * k + 2] - 1;
pDC->SetPixel(k + bmpWidth + offset_left + 1, bmpHeight - 1 - i + offset_top, RGB(red, green, blue));
}
img_line += lineByte;
}
}
指数处理:
将图片亮的部分对比度降低,加大图片较暗部分对比度和对比情况。
//Log处理
void Log(CDC* pDC, unsigned char* img_data, int