一、256色转灰度图
算法介绍(百度百科):
什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 2.整数方法:Gray=(R*30+G*59+B*11)/100 3.移位方法:Gray =(R*28+G*151+B*77)>>8; 4.平均值法:Gray=(R+G+B)/3; 5.仅取绿色:Gray=G; 通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。灰度分为256阶。所以,用灰度表示的图像称作灰度图。
程序实现: ok,知道了什么叫灰度图,下面,咱们就来实现此256色灰度图。这个Convert256toGray(),即是将256色位图转化为灰度图:
变换效果(以下若无特别说明,图示的右边部分都是为某一算法变换之后的效果):
![](http://hi.csdn.net/attachment/201102/26/8394323_1298718547M99j.png)
这是自己的实现如有问题,希望指出:
#include "stdafx.h"
#include "iostream"
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace std;
//int His[his];
void Convert256toGray(const CvArr * srcarr, CvArr *dstarr);
int main()
{
IplImage *srcarr = NULL;
IplImage *dstarr = NULL;
srcarr = cvLoadImage("E:\\c++\\OPENCV_1\\lena.jpg", 1);
dstarr = cvCreateImage( cvSize( srcarr->width, srcarr->height ), srcarr->depth, srcarr->nChannels );
Convert256toGray( srcarr, dstarr );
// cvCvtColor( srcarr, dstarr, CV_RGBA2GRAY );
cvNamedWindow("Exmple", CV_WINDOW_AUTOSIZE);
cvShowImage("Exmple", dstarr);
cvWaitKey(0);
cvReleaseImage(&srcarr);
cvReleaseImage(&dstarr);
cvDestroyWindow("Exmple");
cin.get();
cin.get();
return 0;
}
void Convert256toGray(const CvArr * srcarr, CvArr *dstarr)
{
CvMat sstub, *src = cvGetMat( srcarr, &sstub );
CvMat dstub, *dst = cvGetMat( dstarr, &dstub );
CvSize size = cvGetSize(src);
for ( int y = 0; y < size.height; y++ )
{
uchar* sptr = src->data.ptr + src->step*y;
uchar *Dataout = dst->data.ptr + dst->step*y;
for ( int x = 0; x < size.width; x++, Dataout+=3, sptr+=3)
{
Dataout[1] = ( sptr[1] * 30 + sptr[2] * 59 + sptr[3] * 11 ) / 100;
Dataout[2] = ( sptr[1] * 30 + sptr[2] * 59 + sptr[3] * 11 ) / 100;
Dataout[3] = ( sptr[1] * 30 + sptr[2] * 59 + sptr[3] * 11 ) / 100;
}
}