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?
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);
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);
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.
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);
La méthode du seuil binaire simple est suffisante.
#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.