其實按理說這并不是一件困難的工作,但是由于種種原因,在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就行了,如果都不是,那麼就不是黑白圖像。