web-dev-qa-db-fra.com

Conversion de RVB en noir et blanc avec OpenCV

J'aimerais savoir comment convertir une image RVB en une image noir et blanc (binaire).

Après la conversion, comment puis-je enregistrer l'image modifiée sur le disque?

64
mohammed

D'après les informations dont vous disposez, vous devez le convertir en niveaux de gris, puis le seuiller en binaire.

1. Lire l'image en tant qu'image en niveaux de gris Si vous lisez une image RVB à partir d'un disque, vous pouvez directement la lire en tant qu'image en niveaux de gris, comme suit:

// 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. Convertir une image RVB im_rgb dans une image en niveaux de gris : sinon, vous devrez convertir l’image RVB obtenue précédemment en une image en niveaux de gris.

// 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. Conversion en binaire Vous pouvez utiliser seuillage adaptatif ou seuillage de niveau fixe pour convertir votre image en niveaux de gris en image binaire.

Par exemple. en C, vous pouvez faire ce qui suit (vous pouvez aussi faire la même chose en C++ avec Mat et les fonctions correspondantes):

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

Dans l'exemple ci-dessus, 128 est le seuil.

4. Enregistrer sur le disque

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

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

Cela semblait avoir fonctionné pour moi!

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

Je fais quelque chose de similaire dans l'un de mes messages sur le blog . Un exemple simple en C++ est présenté.

L’objectif était d’utiliser la bibliothèque open source cvBlobsLib pour la détection des échantillons ponctuels imprimés sur des diapositives de micropuce, mais les images doivent être converties à partir de la couleur -> niveaux de gris -> noir + blanc comme vous l’avez mentionné, dans afin d'y parvenir.

1
AndyUK

Une méthode simple pour "binariser" une image consiste à comparer un seuil: par exemple, vous pouvez comparer tous les éléments d’une matrice à une valeur avec opencv en c ++.

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

De cette manière, tous les pixels de la matrice supérieurs à 128 sont maintenant blancs et ceux inférieurs à 128 ou égaux seront noirs.

Facultativement, et pour moi a donné de bons résultats est d'appliquer le flou

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

Plus tard, vous pourrez le sauvegarder comme dit précédemment avec:

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

La méthode du seuil binaire simple est suffisante.

comprendre

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

Vous pouvez utiliser GaussianBlur pour obtenir une image lisse en noir et blanc.

0
MD. Nazmul Kibria