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?
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);
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);
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.
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);
Eine einfache binäre Schwellwertmethode ist ausreichend.
#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.