Convierte RGB a blanco y negro en OpenCV

Me gustaría saber cómo convertir una imagen RGB en una imagen en blanco y negro (binaria).

Después de la conversión, ¿cómo puedo guardar la imagen modificada en el disco?

AFAIK, tienes que convertirlo a escala de grises y luego modificarlo a binario.

1. Lea la imagen como una imagen en escala de grises Si está leyendo la imagen RGB desde el disco, puede leerla directamente como una imagen en escala de grises, como esta:

// 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. Convierta una imagen RGB im_rgb en una imagen en escala de grises : de lo contrario, deberá convertir la imagen RGB obtenida previamente en una imagen en escala de grises

 // 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. Convertir a binario Puede usar umbral de adaptación o umbral de nivel fijo para convertir su imagen en escala de grises en una imagen binaria.

Por ejemplo, en C puede hacer lo siguiente (también puede hacer lo mismo en C ++ con Mat y las funciones correspondientes):

 // 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; 

En el ejemplo anterior, 128 es el umbral.

4. Guardar en el disco

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

Use cv2 y Python:

1- Imagen en escala de grises

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

2- Convertir imagen a Binario

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

3- Tienda para Disck

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

¡Esto pareció haber funcionado para mí!

 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); 

Hago algo similar en una de mis publicaciones en el blog . Se muestra un simple ejemplo de C ++.

El objective era utilizar la biblioteca cvBlobsLib de código abierto para la detección de muestras puntuales impresas en diapositivas de microarrays, pero las imágenes deben convertirse de color -> escala de grises -> negro + blanco como usted mencionó, para lograr esto.

Una forma simple de “binarizar” una imagen es compararla con un umbral: por ejemplo, puede comparar todos los elementos en una matriz con un valor con opencv en c ++

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

De esta forma, todos los píxeles en la matriz mayor que 128 ahora son blancos, y estos menores de 128 o iguales serán negros

Opcionalmente, y para mí dio buenos resultados es aplicar desenfoque

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

Luego puede guardarlo como se dijo anteriormente con:

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

El método simple de umbral binario es suficiente.

incluir

 #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; } 

Puede usar GaussianBlur para obtener una imagen en blanco y negro uniforme.