我想知道下面的代码有什么问题,因为它只显示灰色图像的一部分为二进制图像!
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 :(得分:2)
您的问题出在cv::imread
该函数假定它应该将图像加载为彩色图像,如果要将其作为garyscale图像加载,则应按如下方式调用该函数:
cv::imread(fileName, CV_LOAD_IMAGE_GRAYSCALE)
顺便说一下,你只看到部分图像的原因是因为图像比每个像素的uchar大。 (并且你最终只迭代它的一部分)。
答案 1 :(得分:0)
如果使用OpenCV函数会更容易:
cv::threshold(image_src, image_dst, 200, 255, cv::THRESH_BINARY);
这段代码设置为黑色值(255)所有具有原始值200的像素。