Opencv--像素值变化后的图像显示

来源:互联网 发布:saas多租户数据库设计 编辑:程序博客网 时间:2024/05/16 14:16

灰度图转为彩色图并不知道 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

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;}



0 0