2014-09-06 248 views
0

我想知道下面的代码中存在什么问题,因为它只能以灰度图像的一部分显示为二进制图像!在OpenCV中将灰度图像转换为二进制图像

cv::Mat gry = cv::imread("image_gray.jpg"); 

cv::Mat bin(gry.size(), gry.type()); 

for (int i=0; i<gry.rows ;i++) 

    { 

    for (int j=0; j<gry.cols ;j++) 

    { 
     if (gry.at<uchar>(i,j)>=100) 

      bin.at<uchar>(i,j)=255; 
     else 
      bin.at<uchar>(i,j)=0; 

    } 

    } 

cv::namedWindow("After", cv::WINDOW_AUTOSIZE); 

cv::imshow("After",bin); 

waitKey(0); 

cvDestroyWindow("After"); 

imwrite("binary_image.bmp", bin); 
+0

你有没有考虑原来的像素值只需使用'Mat bin = gray> = 100;'?可能要快得多,更干净。 – 2014-09-06 17:19:18

+2

[将OpenCV图像转换为黑白图像]可能的副本(http://stackoverflow.com/questions/7624765/converting-an-opencv-image-to-black-and-white) – Basilevs 2014-09-06 17:19:43

+0

非常感谢您的支持答案lwillnotexist Idonotexist但我是一名学生,我的老师想要一步一步做到这一点:( – 2014-09-06 17:51:01

回答

2

你的问题是在cv::imread
功能假定它应该加载图像作为彩色图像,如果你想将其加载为garyscale图像,你应该调用函数如下:

cv::imread(fileName, CV_LOAD_IMAGE_GRAYSCALE) 

顺便说一句,你看到的只是理由部分图像,是因为图像比每个像素的uchar大。 (并且最终只会遍历其中的一部分)。

+0

非常感谢您的帮助,正如您所说的,问题在于imread函数,我非常感谢您在我有一天的帮助下,不知道问题所在,谢谢。 – 2014-09-06 19:27:22

0

如果使用使用OpenCV的功能,它会更容易:

cv::threshold(image_src, image_dst, 200, 255, cv::THRESH_BINARY); 

这段代码设置为黑色值(255)所有那些具有为200