使用openCV查看png圖片的各通道值

        png格式的圖片除了能展現出各種各樣的色彩外,還能表現出“透明”的特點,這是因爲這種格式的圖片除了含有我們常見的RGB三個顏色通道外,還有一個A通道來控制圖片的透明效果。使用openCV可以方便的查看各種格式圖片各個通道的值,思路如下:

  1. 首先,我們需要加載一幅圖片;
  2. 爲了能夠查看這個圖片上每個像素點各個通道的數值,我們可以通過鼠標點擊的方式來選擇像素點,然後讀取這個像素點各通道的數值,並顯示出來;
  3. 爲了判斷顯示是否正確,還可以新建一幅圖片,用所選擇像素點的顏色填充,判斷這幅圖片的顏色是否是我們選擇的顏色。
        代碼如下:
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

IplImage *src;
IplImage *show;

void mouseHandler(int event, int x, int y, int flags, void *param);

int main()
{
	char *picture = "D:\\test\\2\\2.png";

	if((src = cvLoadImage(picture,CV_LOAD_IMAGE_UNCHANGED)) == 0)
	{
		cout<<"read Picture error"<<endl;
		return -1;
	}

	cvNamedWindow("picture", CV_WINDOW_AUTOSIZE);
	cvSetMouseCallback("picture",mouseHandler,NULL);
	cvShowImage("picture",src);


	show = cvCreateImage(cvSize(200,200),src->depth,src->nChannels);
	cvZero(show);

	cvNamedWindow("show", CV_WINDOW_AUTOSIZE);
	cvWaitKey();
}

void mouseHandler(int event, int x, int y, int flags, void *param)
{
	int R = 0,G = 0,B = 0,A = 0;
	uchar *c_src;
	ushort *s_src;

	uchar *c_dst;
	ushort *s_dst;

	switch(event)
	{
	case CV_EVENT_LBUTTONDOWN:
		cout<<"x = "<<x<<",y = "<<y<<endl;
		//得到選擇像素點的值
		if(src->depth == IPL_DEPTH_8U)
		{
			c_src = (uchar *)(src->imageData + y*src->widthStep + x*src->nChannels);
			B = c_src[0];
			G = c_src[1];
			R = c_src[2];
			A = c_src[3];
		}
		else if(src->depth == IPL_DEPTH_16U)
		{
			s_src = (ushort *)(src->imageData + y*src->widthStep + x*src->nChannels);
			B = s_src[0];
			G = s_src[1];
			R = s_src[2];
			A = s_src[3];
		}
		cout<<"B = "<<B<<",G = "<<G<<",R = "<<R<<",A = "<<A<<endl<<endl;

		//複製
		if(show->depth = IPL_DEPTH_8U)
		{
			for(int i = 0; i < show->height;i++)
			{
				for(int j = 0;j < show->width;j++)
				{
					c_dst = (uchar *)(show->imageData + i * show->widthStep + j * show->nChannels);
					memcpy(c_dst,c_src,sizeof(uchar)*src->nChannels);
				}
			}
		}
		else if(show->depth = IPL_DEPTH_16U)
		{
			for(int i = 0; i<show->height;i++)
			{
				for(int j = 0;j<show->width;j++)
				{
					s_dst = (ushort *)(show->imageData + i * show->widthStep + j * show->nChannels);
					memcpy(s_dst,s_src,sizeof(ushort)*src->nChannels);
				}
			}
		}
		cvShowImage("show",show);
		//cvSaveImage("E:\\1.png",show);
		break;
	default:
		break;
	}
}

        要的到選擇像素點的值,首先需要了解openCV中圖片的數據佈局。一幅5*5的png圖片的數據佈局如圖,水平方向爲Width,垂直方向爲Height。


        如果要選擇(2,3)處的像素點,首先需要將指針直到第2行:ptr = (uchar *)(src->imageData + 2*src->widthStep);然後將指針指到第2行第3列:ptr += 3*src->nChannels;這時ptr就指向了(2,3)這個像素點。ptr[0]、ptr[1]、ptr[2]、ptr[3]分別是四個通道的數值。要注意,openCV中三原色的順序是B、G、R。

        如果要選擇(x,y)處的像素點(座標原點在左上角),ptr = (uchar *)(src->imageData + y*src->widthStep + x*src->nChannels)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章