基于mfc数字图像处理的小软件pdd-转换图片成RGB通道,反色,黑白,灰度图片
2014-12-08 19:24
1041 查看
上一篇我们说到如何用MFC框架实现点击打开按钮能够打开一张图片在窗口上显示和另存为按钮能够保存到另一个文件,那么现在我们对图片进行简单的处理。
我们知道,图片是由一个一个像素组成的,我们后来会对图像处理作空间域和频率域的划分,现在我们所说的内容都是指图片在空间域的处理。对图片的每个像素进行处理,自然就想到改变图片的每个像素值即可,我们用到CImage这个强大的类作为基础,自己再写出一个子类继承CImge即可。
首先,在你的界面菜单上添加几个按钮:如下
然后为每个按钮添加事件处理程序,我这里贴一个RED的吧,其他的与它类似,我是添加在pddView这个cpp里面的,因为上一篇得到的pathName这个参数可以用来实例化我继承CImage的这个子类。
其中上面的m_MyImage是CImage类的一个子对象,Red()方法是我在我的子类里面定义的,子类叫做ChangeColor,继承CImage。
下面是我ChangeColor的头文件。
下面的一些方法我会在以后的文章中一一为大家介绍,今天我们讲的只是RGB通道,反色,将彩色图片变为灰度图和黑白图片而已。
下面我会贴出具体实现RED的代码,因为另外的方法和它类似,只是改变像素值的方法不一样而已。
每个index 分别对应RGB三个通道的值,如上述操作让GB通道的值都为0,那么图片就只剩下红色通道了,也就将图片处理完毕了。同理,GB一样,那么,反色和灰度,黑白如何呢?
反色:只需要将各个通道的像素值由255-原来的即可:
灰度:将彩色图片变为灰度图,只需要使RGB三个颜色通道的值相等即可:
黑白:先将图片变为灰度图像,也就是使每个通道的值相等,然后在进行如下的操作即可:
现在大家知道怎么简单的将一张图片的RGB三个通道分别表示,以及将彩色图片变为灰度图片和反色,黑白图片了吧。!
贴效果图:
好啦,。我是脑残粉!!
我们知道,图片是由一个一个像素组成的,我们后来会对图像处理作空间域和频率域的划分,现在我们所说的内容都是指图片在空间域的处理。对图片的每个像素进行处理,自然就想到改变图片的每个像素值即可,我们用到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三个通道分别表示,以及将彩色图片变为灰度图片和反色,黑白图片了吧。!
贴效果图:
好啦,。我是脑残粉!!
相关文章推荐
- 基于mfc数字图像处理的小软件pdd-改变图片的大小
- 基于mfc的数字图像处理的小软件pdd的诞生-打开图片及保存图片
- 基于mfc数字图像处理的小软件pdd-量化灰度图像
- 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
- Opencv (Opencv2)结合MFC学习数字图像处理---显示图片
- 图像遍历反色处理,遍历多通道图片
- 图像处理--RGB到HSI的彩色转换--图像分割(MFC VC++)
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理具体解释
- 图片处理工具类: 功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
- Opencv (Opencv2)结合MFC学习数字图像处理---图片解码(1)
- Opencv (Opencv2)结合MFC学习数字图像处理---图片解码(3)
- 数字图像处理MFC程序设计之灰度图像的线性变换
- 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能
- [Python]图像处理日记——第一天(如何查询图片属性,数组与RGB,灰度图像如何互换)
- 基于MFC和OpenCV的图像处理小软件(续)
- Opencv (Opencv2)结合MFC学习数字图像处理【2】---图片解码
- 数字图像处理——灰度变换与空间滤波(使用MFC)
- Java对图片的处理---缩放图像、图像切割、图像类型转换、彩色转为黑白