web-dev-qa-db-de.com

Konvertieren Sie RGB in Schwarzweiß in OpenCV

Ich möchte wissen, wie man ein RGB-Bild in ein Schwarzweißbild (Binärbild) konvertiert.

Wie kann ich das geänderte Bild nach der Konvertierung auf der Festplatte speichern?

64
mohammed

AFAIK, Sie müssen es in Graustufen konvertieren und dann auf binär setzen.

1. Bild als Graustufenbild lesen Wenn Sie das RGB-Bild von der Festplatte lesen, können Sie es wie folgt direkt als Graustufenbild lesen:

// 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. Ein RGB-Bild konvertieren im_rgb in ein Graustufenbild umwandeln : Andernfalls müssen Sie das zuvor erhaltene RGB-Bild in ein Graustufenbild umwandeln

// 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. In Binärbild konvertieren Sie können adaptives Schwellenwert oder Schwellenwert auf fester Ebene verwenden, um Ihr Graustufenbild in ein Binärbild zu konvertieren.

Z.B. In C können Sie Folgendes tun (Sie können dasselbe auch in C++ mit Mat und den entsprechenden Funktionen tun):

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

Im obigen Beispiel ist 128 der Schwellenwert.

4. Auf Datenträger speichern

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

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

Das schien bei mir geklappt zu haben!

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

Ich mache etwas Ähnliches in einem meiner Blogpostings . Ein einfaches C++ - Beispiel wird gezeigt.

Ziel war es, die Open Source - Bibliothek cvBlobsLib zur Erkennung von auf Microarray - Objektträgern gedruckten Stichproben zu verwenden. Die Bilder müssen jedoch, wie bereits erwähnt, von Farbe -> Graustufen -> Schwarz + Weiß in konvertiert werden Um dies zu erreichen.

1
AndyUK

Eine einfache Möglichkeit, ein Bild zu "binarisieren", besteht darin, es mit einem Schwellenwert zu vergleichen: Beispielsweise können Sie mit opencv in c ++ alle Elemente in einer Matrix mit einem Wert vergleichen

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

Auf diese Weise sind jetzt alle Pixel in der Matrix, die größer als 128 sind, weiß, und diese, die kleiner als 128 oder gleich sind, sind schwarz

Optional und für mich gab es gute Ergebnisse, Unschärfe anzuwenden

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

Später können Sie es wie gesagt speichern mit:

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

Eine einfache binäre Schwellwertmethode ist ausreichend.

umfassen

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

Sie können GaussianBlur verwenden, um ein glattes Schwarzweißbild zu erhalten.

0