2009-10-18 17 views

Odpowiedz

128

AFAIK, musisz przekonwertować go na skalę szarości, a następnie ustawić go na binarny.

1. Przeczytaj obrazu jako skali szarości Jeśli czytasz ten obraz RGB z dysku, a następnie można bezpośrednio odczytać go jako skali szarości, tak:

// 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 . Konwersja obrazu RGB im_rgb w skali szarości: w przeciwnym razie trzeba będzie przekształcić uprzednio otrzymanej RGB obraz w skali szarości

// 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. Konwertuj na kod binarny Możesz użyć adaptive thresholding lub fixed-level thresholding, aby przekształcić obraz w skali szarości na obraz binarny.

E.g. w ° C można wykonać następujące (można również zrobić to samo w C++ matą, a odpowiednie funkcje)

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

W powyższym przykładzie, 128 jest próg.

4. Zapisz na dysk

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

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

W zależności od aplikacji może być konieczne ustawienie ditheringu zamiast prostego progu. –

+0

w funkcji CvtColor potrzebujemy użyć CV_RGB2GRAY lub CV_BGR2GRAY. Czytałem, że opencv jest oparty na formacie BGR i musimy go użyć, ale na szarym lub binarnym obrazie nie widzę żadnych różnic przy używaniu któregokolwiek z nich. – evk1206

1

zrobić coś podobnego w jednym z moich blog postings. Pokazany jest prosty przykład C++.

Celem było wykorzystanie open source cvBlobsLib bibliotekę do wykrywania próbek punktowych drukowanych na slajdach mikromacierzy, ale obrazy muszą być przekształcony z kolorem -> skala szarości -> czarny + biały, jak wspomniano, w celu osiągnąć to.

+0

Chciałbym zobaczyć twoją pracę: zdjęcia muszą być przekonwertowane z kolorów -> skala szarości -> czarny + biały jak wspomniałeś, Dzięki – RidaSana

+0

Podany powyżej link nie działa, ten ma: [link] (http://www.technical-recipes.com/2011/object -detekcja-using-the-opencv-cvblobslib-library /) – Yeraze

1

Prostym sposobem „binarize” obraz jest porównanie do progu: Na przykład można porównać wszystkie elementy macierzy na wartości z OpenCV w C++

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

W ten sposób wszystko pikseli w matrycy większej niż 128 teraz są białe, a te mniej niż 128 lub równe będą czarne

Opcjonalnie, dla mnie i dał dobre rezultaty jest zastosowanie rozmycia

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

Później można go zapisać jako mówiłem z:

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

Czy JPEG jest właściwym formatem dla B & W ???? – user1741137

+0

Nie wiem ... Myślę, że to zależy od tego, jaki typ obrazu oszczędzasz. W przypadku zdjęć (pracowałem ze zdjęciami) uważam, że jest to właściwy format. – alvaropgl

+1

Problem z JPEG polega na tym, że wprowadza artefakty i pogarsza jakość obrazu. Chciałbym użyć PNG lub dla naprawdę małych plików TIFF z kompresją CCITT Fax 4. – user1741137

7

Korzystanie CV2 i Python:

1- skali szarości

import cv2 
im_gray = cv2.imread('grayscale_image.png', cv2.CV_LOAD_IMAGE_GRAYSCALE) 

2- Konwersja obrazu do Binary

(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 

3- Store do Disck

cv2.imwrite('bw_image.png', im_bw) 
+0

To dotyczy rzeczywiście progu, ale bitdepth pozostaje 8. – kevto

1

Wydawało się, że pracował dla mnie!

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

Prosta metoda progowa binarna jest wystarczająca.

obejmują

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

Można użyć GaussianBlur do uzyskania gładkiej czarno-biały obraz.