您的位置:首页 > 其它

基于mfc数字图像处理的小软件pdd-转换图片成RGB通道,反色,黑白,灰度图片

2014-12-08 19:24 1041 查看
上一篇我们说到如何用MFC框架实现点击打开按钮能够打开一张图片在窗口上显示和另存为按钮能够保存到另一个文件,那么现在我们对图片进行简单的处理。

我们知道,图片是由一个一个像素组成的,我们后来会对图像处理作空间域和频率域的划分,现在我们所说的内容都是指图片在空间域的处理。对图片的每个像素进行处理,自然就想到改变图片的每个像素值即可,我们用到CImage这个强大的类作为基础,自己再写出一个子类继承CImge即可。

首先,在你的界面菜单上添加几个按钮:如下



然后为每个按钮添加事件处理程序,我这里贴一个RED的吧,其他的与它类似,我是添加在pddView这个cpp里面的,因为上一篇得到的pathName这个参数可以用来实例化我继承CImage的这个子类。

void CpddView::OnColorRed()
{
reload();

int iWidth = m_MyImage.GetWidth();
int iHeight = m_MyImage.GetHeight();
m_MyImage.Red(); //处理成红色通道的图片
m_MyImage.Draw(GetDC()->m_hDC, 0, 0, iWidth, iHeight);

}

其中上面的m_MyImage是CImage类的一个子对象,Red()方法是我在我的子类里面定义的,子类叫做ChangeColor,继承CImage。

下面是我ChangeColor的头文件。

#pragma once
#define PI 3.1415926535897931
#include "atlimage.h"
#include "atltypes.h"

class ChangeColor :
public CImage
{
public:

ChangeColor(void);
~ChangeColor(void);
void Negative(void);
void Red(void);
void Green(void);
void Blue(void);
void Grey(void);
void Black_White(void);
void Down_Scale192_128(CString );
void Down_Scale96_64(CString );
void Down_Scale48_32(CString );
void Down_Scale24_16(CString );
void Down_Scale12_8(CString );
void Down_Scale300_200(CString );
void Up_Scale450_300(CString);
void Scale500_200(CString);
void Change_Size1(ChangeColor,int);//easy
void Change_Size2(ChangeColor);//双线性内插法
void Quantization_128(void);
void Quantization_32(void);
void Quantization_8(void);
void Quantization_4(void);
void Quantization_2(void);
void ScaleAny(CString, int, int);//将图片转化为任意尺寸
void Convert_To_Another(int,int,int,CString,CString);//是两张同样像素的图片渐变
int* Original_Gray();
int* Processed_Gray();
int** View_As_Window(int,int,int);
void SmoothAny(CString,int ,int);
void Laplacian(CString,int ,int);
void Soble1(CString, int, int);
void Soble2(CString, int, int);
void DFT(CString ,int );
void FFT(CString );
void Filtering_In_Frequency_Domain(CString, int );

};


下面的一些方法我会在以后的文章中一一为大家介绍,今天我们讲的只是RGB通道,反色,将彩色图片变为灰度图和黑白图片而已。

下面我会贴出具体实现RED的代码,因为另外的方法和它类似,只是改变像素值的方法不一样而已。

void ChangeColor::Red(void)
{
int i, j;

int nRowBytes = GetPitch();//图像每一行的字节数,注意这个值一般是负数
int nWidth = GetWidth();//得到图片的宽
int nHeight = GetHeight();//得到图片的长

int nClrs = GetBPP() / 8;
LPBYTE p = (LPBYTE)GetBits();

for (int index = 0; index < nClrs - 1; index++) //颜色通道
{
for (i = 0; i < nHeight; i++) //第i行
{
for (j = 0; j < nWidth; j++) //第j列
{
p[i*nRowBytes + j*nClrs + index] = 0;//可以理解为像素点每个通道的值,index是指在哪个通道。
}
}
}
}

每个index 分别对应RGB三个通道的值,如上述操作让GB通道的值都为0,那么图片就只剩下红色通道了,也就将图片处理完毕了。同理,GB一样,那么,反色和灰度,黑白如何呢?

反色:只需要将各个通道的像素值由255-原来的即可:

p[i*nRowBytes + j*nClrs + index] = 255 - p[i*nRowBytes + j*nClrs + index];


灰度:将彩色图片变为灰度图,只需要使RGB三个颜色通道的值相等即可:

p[i*nRowBytes + j*nClrs + 0] = (p[i*nRowBytes + j*nClrs + 0] + p[i*nRowBytes + j*nClrs + 1] + p[i*nRowBytes + j*nClrs + 2]) / 3;
p[i*nRowBytes + j*nClrs + 1] = p[i*nRowBytes + j*nClrs + 0];
p[i*nRowBytes + j*nClrs + 2] = p[i*nRowBytes + j*nClrs + 0];


黑白:先将图片变为灰度图像,也就是使每个通道的值相等,然后在进行如下的操作即可:

if (p[i*nRowBytes + j*nClrs + 0] > 127)
{
p[i*nRowBytes + j*nClrs + 0] = 255;
p[i*nRowBytes + j*nClrs + 1] = 255;
p[i*nRowBytes + j*nClrs + 2] = 255;
}
if (p[i*nRowBytes + j*nClrs + 0] < 128)
{
p[i*nRowBytes + j*nClrs + 0] = 0;
p[i*nRowBytes + j*nClrs + 1] = 0;
p[i*nRowBytes + j*nClrs + 2] = 0;
}


现在大家知道怎么简单的将一张图片的RGB三个通道分别表示,以及将彩色图片变为灰度图片和反色,黑白图片了吧。!

贴效果图:





好啦,。我是脑残粉!!


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐