Преобразование RGB в черно-белый в OpenCV

Я хотел бы знать, как преобразовать изображение RGB в черно-белое (двоичное) изображение.

После преобразования, как я могу сохранить измененное изображение на диск?

AFAIK, вы должны преобразовать его в оттенки серого, а затем порождать его в двоичном формате.

1. Прочитайте изображение как изображение в gradleациях серого. Если вы читаете изображение RGB с диска, вы можете прямо прочитать его как изображение в gradleациях серого, например:

// C IplImage* im_gray = cvLoadImage("image.jpg",CV_LOAD_IMAGE_GRAYSCALE); // C++ (OpenCV 2.0) Mat im_gray = imread("image.jpg",CV_LOAD_IMAGE_GRAYSCALE); 

2. Преобразуйте изображение RGB im_rgb в полутоновое изображение : в противном случае вам нужно будет преобразовать ранее полученное изображение RGB в полутоновое изображение

 // C IplImage *im_rgb = cvLoadImage("image.jpg"); IplImage *im_gray = cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1); cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY); // C++ Mat im_rgb = imread("image.jpg"); Mat im_gray; cvtColor(im_rgb,im_gray,CV_RGB2GRAY); 

3. Преобразование в двоичный файл. Вы можете использовать адаптивное пороговое значение или пороговое значение фиксированного уровня для преобразования изображения в gradleациях серого в двоичное изображение.

Например, в C вы можете сделать следующее (вы также можете сделать то же самое в C ++ с Mat и соответствующими функциями):

 // C IplImage* im_bw = cvCreateImage(cvGetSize(im_gray),IPL_DEPTH_8U,1); cvThreshold(im_gray, im_bw, 128, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); // C++ Mat img_bw = im_gray > 128; 

В приведенном выше примере 128 является пороговым значением.

4. Сохранить на диск

 // C cvSaveImage("image_bw.jpg",img_bw); // C++ imwrite("image_bw.jpg", img_bw); 

Используйте cv2 и Python:

Изображение полутонового изображения

 import cv2 im_gray = cv2.imread('grayscale_image.png', cv2.CV_LOAD_IMAGE_GRAYSCALE) 

2- Преобразование изображения в двоичный

 (thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 

3 магазина для Disck

 cv2.imwrite('bw_image.png', im_bw) 

Казалось, это сработало для меня!

 Mat a_image = imread(argv[1]); cvtColor(a_image, a_image, CV_BGR2GRAY); GaussianBlur(a_image, a_image, Size(7,7), 1.5, 1.5); threshold(a_image, a_image, 100, 255, CV_THRESH_BINARY); 

Я делаю что-то подобное в одном из моих сообщений в блоге . Отображается простой пример C ++.

objective состояла в том, чтобы использовать библиотеку cvBlobsLib с открытым исходным кодом для обнаружения выборочных выборок, напечатанных на слайдах микрочипов, но изображения должны быть преобразованы из цвета -> оттенки серого -> черный + белый, как вы упомянули, для достижения этого.

Простым способом «бинаризации» изображения является сравнение с порогом: например, вы можете сравнить все элементы в матрице со значением с opencv в c ++

 cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); cv::Mat bw = img > 128; 

Таким образом, все пиксели в матрице, превышающие 128, теперь белые, и они меньше 128 или равно будут черными

Необязательно, и для меня хорошие результаты – применять размытие

 cv::blur( bw, bw, cv::Size(3,3) ); 

Позже вы можете сохранить его, как сказано ранее:

 cv::imwrite("image_bw.jpg", bw); 

Достаточно простого двоичного порогового метода.

include

 #include  #include "opencv/highgui.h" #include "opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; int main() { Mat img = imread("./img.jpg",0);//loading gray scale image threshold(img, img, 128, 255, CV_THRESH_BINARY);//threshold binary, you can change threshold 128 to your convenient threshold imwrite("./black-white.jpg",img); return 0; } 

Вы можете использовать GaussianBlur чтобы получить гладкое черно-белое изображение.

  • Как обрезать изображение с помощью C #?
  • Взаимная информация и совместная энтропия двух изображений - MATLAB
  • Автоматический расчет низких и высоких порогов для операции Canny в opencv
  • Заполните отверстия в OpenCV
  • Прохождение через пиксели в BMP
  • Как разделить изображение на блоки в MATLAB?
  • Как использовать свойство ScanLine для 24-битных растровых изображений?
  • Есть ли способ обнаружить, что изображение размыто?
  • Загрузка изображений с помощью node.js
  • Выполнение преобразования ширины штриха (SWT) (Java, C # ...)
  • Ускорение преобразования точечного изображения в bitmap, является ли OpenMP опцией в C #?
  • Давайте будем гением компьютера.