Chciałbym dowiedzieć się, jak przekonwertować obraz RGB na czarny (binarny) obraz o wartości &.Konwertuj RGB na czarno-biały w OpenCV
Jak po konwersji mogę zapisać zmodyfikowany obraz na dysk?
Chciałbym dowiedzieć się, jak przekonwertować obraz RGB na czarny (binarny) obraz o wartości &.Konwertuj RGB na czarno-biały w OpenCV
Jak po konwersji mogę zapisać zmodyfikowany obraz na dysk?
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);
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.
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
Podany powyżej link nie działa, ten ma: [link] (http://www.technical-recipes.com/2011/object -detekcja-using-the-opencv-cvblobslib-library /) – Yeraze
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);
Czy JPEG jest właściwym formatem dla B & W ???? – user1741137
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
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
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)
To dotyczy rzeczywiście progu, ale bitdepth pozostaje 8. – kevto
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);
Prosta metoda progowa binarna jest wystarczająca.
#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.
W zależności od aplikacji może być konieczne ustawienie ditheringu zamiast prostego progu. –
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