天天看點

我的OpenCV學習筆記(22):如何差別一幅圖像是否是黑白圖像

其實按理說這并不是一件困難的工作,但是由于種種原因,在OpenCV中讀取的黑白圖像并不是我們想像的隻有一個通道,而是3通道的。但是當我們使用Mat image = imread("D:/picture/images/baboon2.jpg",0);之後,不論是彩色圖像還是黑白圖像都會轉換為單通道。明白了這個之後,我們的程式就簡單了:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main()
{
	//Mat image = imread("D:/picture/images/baboon2.jpg",0);
	//Mat image = imread("D:/picture/images/baboon2.jpg");
	//Mat image = imread("D:/picture/images/binary.bmp");
	Mat image = imread("D:/picture/image.png");


	if(!image.data)
		return -1;
	
	int row = image.rows;
	int col = image.cols;
	int cnt= 0;
	for(int i = 0; i < row;i++)
	{
		for(int j = 0; j<col;j++)
		{
			if(image.channels() ==3)
			{

				
				if(	(int)(image.at<Vec3b>(i,j)[0]) != 0 &&  (int)(image.at<Vec3b>(i,j)[0]) != 255 && 
					(int)(image.at<Vec3b>(i,j)[1]) != 0 &&  (int)(image.at<Vec3b>(i,j)[1]) != 255 && 
					(int)(image.at<Vec3b>(i,j)[2]) != 0 &&  (int)(image.at<Vec3b>(i,j)[2]) != 255)
				{
					cnt++;
				}
				
			}
			else if(image.channels() ==1)
			{
				if((int)(image.at<uchar>(i,j)) != 0 &&  (int)(image.at<uchar>(i,j)) != 255)
				{
					cnt++;
				}
			}
		}
	}
	if(cnt == 0)
	{
		std::cout<<"這是黑白圖像"<<std::endl;
	}
	else
	{
		std::cout<<"這是不是黑白圖像"<<std::endl;
	}
	
	//顯示圖像以驗證結果
	imshow("圖像",image);
	waitKey(0);
	return 0;
}
           

隻需要判斷每個像素值是否為0或者255就行了,如果都不是,那麼就不是黑白圖像。