灰度图转为彩色图, 并不知道 RGB 与 灰度 的比例关系,只能简单地 设 一点的 R=G=B=灰度;
就算转成功了,看上去还是灰色。
<span style="font-size:18px;">if (img.type()==CV_8UC1) { //input image is grayscale cvtColor(img, cimg, CV_GRAY2RGB); } else { //input image is colour }</span>
在一个项目中,我调试一个改变像素的图像的程序,发现:当格式是jpg的时候不一定能更新,也就是说三通道确实是改变了,但图像却不会改变。身为菜鸟的我也不知道原因为什么jpg有时候不能显示,但根据调试,格式为bmp的是可以实现的。格式为bmp的是可以实现的。格式为bmp的是可以实现的。重要的事情说3遍!!!
另外一个牢记的知识点:在使用cvGet2D函数获得操作目标并运行后,一定要使用cvSet2D来设置RGB。
cvget2d函数:返回特殊的数组元素;
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
arr:输入数组.
idx0:元素下标第一个以0为基准的成员;
idx1:元素下标第二个以0为基准的成员;
idx2:元素下标第三个以0为基准的成员;
idx:元素下标数组
函数cvGet*D 返回指定的数组元素。对于稀疏数组如果需要的节点不存在函数返回0 (不会创建新的节点)
同样,用cvSet2D即可设置图片的RGB值。
参考实例如下:
CvScalar s; for(y = 0; y < img->height; y++) { for(x = 0; x < img->width; x++) { s = cvGet2D(img, y, x); } }
贴上代码:
#include <stdio.h> #include <cv.h> #include <highgui.h> using namespace std; using namespace cv; int main() { IplImage* pFrame = NULL; IplImage* pFrImg = NULL; cvNamedWindow("三通道操作",1); IplImage* image=cvLoadImage("board.bmp",0);//按照图片本身的格式操作 //cvShowImage("图像显示",image); for (int i = 0; i <image->height; i++) { for (int j = 0; j <image->width; j++) { //间接访问 CvScalar s=cvGet2D(image,i,j); //其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。 //if((s.val[1]<150)||(s.val[1]>170)) //s.val[1]=0; s.val[0]=123;s.val[1]=123;s.val[2]=123; cout<<"B="<<s.val[0]<<setw(5)<<"G="<<s.val[1]<<setw(5)<<"R="<<s.val[2]<<endl; } } cvShowImage("图像显示",image); cvWaitKey(0); cvReleaseImage(&image); cvDestroyWindow("图像显示"); return 0; }
看看结果:
当然这是作为 IPlImage形式来做的。现在都已经用Mat矩阵操作量了。至于为什么是灰度图,三个通道相等。改变通道后会直接在图像中改变,不需要更新函数。
贴上操作后代码:
#include <stdio.h> #include <cv.h> #include <highgui.h> using namespace std; using namespace cv; int main() { IplImage* pFrame = NULL; IplImage* pFrImg = NULL; cvNamedWindow("三通道操作",1); IplImage* image=cvLoadImage("board.bmp",1);//按照图片本身的格式操作,0是强制灰度图 //cvShowImage("图像显示",image); for (int i = 0; i <image->height; i++) { for (int j = 0; j <image->width; j++) { //间接访问,设置图片RGB CvScalar s=cvGet2D(image,i,j); //其中i代表height;j代表width。 if((s.val[0]<150)||(s.val[0]>170)) s.val[0]=0; //s.val[0]=123;s.val[1]=123;s.val[2]=123; cout<<"B="<<s.val[0]<<setw(5)<<"G="<<s.val[1]<<setw(5)<<"R="<<s.val[2]<<endl; cvSet2D(image,i,j,s); } } //cvSaveImage("图像显示",image); cvShowImage("图像显示",image); cvWaitKey(0); cvReleaseImage(&image); cvDestroyWindow("图像显示"); return 0; }