2014-09-06 3 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;'? Наверное, гораздо быстрее и чище. –

+2

Возможный дубликат [Преобразование изображения OpenCV в черно-белый] (http://stackoverflow.com/questions/7624765/converting-an-opencv-image-to-black-and-white) – Basilevs

+0

Большое спасибо за ваш ответить lwillnotexist Idonotexist Но я студент, и мой инструктор хочет сделать это шаг за шагом :( –

ответ

2

Ваша проблема в cv::imread.
функция предполагает, что он должен загрузить изображение как цветное изображение, если вы хотите, чтобы загрузить его в качестве garyscale изображения, вы должны вызвать функцию следующим образом:

cv::imread(fileName, CV_LOAD_IMAGE_GRAYSCALE) 

Кстати, причина, вы видите только является частью изображения, потому что изображение просто больше, чем ухар для каждого пикселя. (и вы заканчиваете итерацию только над ее частью).

+0

Большое спасибо за вашу помощь. Как вы сказали, проблема была в функции imread. Я так благодарен за вашу помощь. Я провел один день и не знал, в чем проблема. Спасибо. –

0

было бы проще, если использовать с помощью функции OpenCV:

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

Этот фрагмент кода установлен как черный значения (255) все те пиксели, которые имеют в качестве исходного значения 200.

Смежные вопросы