Converteer RGB naar Black & AMP; Wit in OpenCV

Ik zou graag willen weten hoe een RGB-afbeelding in een Black & AMP kan converteren; wit (binair) beeld.

Na conversie, hoe kan ik de gewijzigde afbeelding op schijf opslaan?


Antwoord 1, Autoriteit 100%

AFAIK, je moet het omzetten naar grijswaarden en dan drempeld het tot binair.

1. Lees de afbeelding als een grijswaardenbeeld
Als u het RGB-beeld van de schijf aan het lezen bent, kunt u het direct lezen als een grijswaardenbeeld, zoals deze:

// 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. Converteer een RGB-afbeelding im_rgbin een grijswaardenbeeld : anders moet u de eerder verkregen RGB-afbeelding omzetten in een grijswaardenafbeelding

// 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. Converteren naar Binary
U kunt adaptieve drempelwaarde of Vaste-level drempelwaarde om uw grijstinste afbeelding om te zetten naar een binair beeld.

b.v. In C kunt u het volgende doen (u kunt ook hetzelfde doen in C++ met mat en de bijbehorende functies):

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

In het bovenstaande voorbeeld is 128 de drempelwaarde.

4. Opslaan op schijf

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

Antwoord 2, Autoriteit 2%

Dit leek voor mij te hebben gewerkt!

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

Antwoord 3

Ik doe iets soortgelijks in een van mijn Blogboekingen . Een eenvoudig C++ -voorbeeld wordt getoond.

Het doel was om de open source cvblobslib bibliotheek voor de detectie te gebruiken
van spotmonsters afgedrukt op microarray-dia’s, maar de afbeeldingen moeten zijn
omgezet van kleur – & GT; Grayscale – & GT; zwart + wit zoals u al zei, om dit te bereiken.


Antwoord 4

Een eenvoudige manier van “binarize” is een afbeelding om te vergelijken met een drempel:
U kunt bijvoorbeeld alle elementen in een matrix vergelijken met een waarde met OpenCV in C++

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

Op deze manier zijn alle pixels in de matrix groter dan 128 nu wit, en deze minder dan 128 of gelijken zijn zwart

Eventueel, en voor mij gaf goede resultaten om blur

toe te passen

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

later kunt u het opslaan zoals eerder gezegd met:

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

Antwoord 5

Eenvoudige binaire drempelmethode is voldoende.

omvatten

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

Je kunt GaussianBlurgebruiken om een vloeiend zwart-wit beeld te krijgen.

Other episodes