c++ - seguimiento - Convierte RGB a blanco y negro en OpenCV
recorrer imagen pixel por pixel python (6)
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?
¡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);
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);
El método simple de umbral binario es suficiente.
incluir
#include <string>
#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.
Hago algo similar en una de mis publicaciones en el blog . Se muestra un simple ejemplo de C ++.
El objetivo era utilizar la biblioteca cvBlobsLib 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);
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)