Подтвердить что ты не робот

Преобразование RGB в черно-белый в OpenCV

Я хотел бы знать, как преобразовать изображение RGB в черно-белое (двоичное) изображение.

После преобразования, как я могу сохранить измененное изображение на диск?

4b9b3361

Ответ 1

AFAIK, вы должны преобразовать его в оттенки серого, а затем порождать его в двоичном формате.

1. Прочитайте изображение как изображение в градациях серого. Если вы читаете изображение RGB с диска, вы можете прямо прочитать его как изображение в градациях серого, например:

// 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. Преобразуйте изображение RGB im_rgb в полутоновое изображение. В противном случае вам нужно будет преобразовать ранее полученное изображение RGB в полутоновое изображение

// 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. Преобразовать в двоичный Вы можете использовать адаптивное пороговое значение или фиксированный уровень для преобразования ваше изображение в оттенках серого на двоичное изображение.

например. в C вы можете сделать следующее (вы также можете сделать то же самое в С++ с Mat и соответствующими функциями):

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

В приведенном выше примере 128 является порогом.

4. Сохранить на диск

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

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

Ответ 2

Используйте cv2 и Python:

Изображение в оттенках серого

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

2- Преобразование изображения в двоичный

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

3- Сохранить Disck

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

Ответ 3

Я делаю что-то подобное в одном из сообщений . Отображается простой пример С++.

Целью было использовать библиотеку open-source cvBlobsLib для обнаружения точечных образцов, напечатанных на слайдах микрочипов, но изображения должны быть преобразованный из цвета → оттенки серого → черный + белый, как вы упомянули, чтобы достичь этого.

Ответ 4

Простым способом "бинаризации" изображения является сравнение с порогом: Например, вы можете сравнить все элементы в матрице со значением с opencv в С++

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

Таким образом, все пиксели в матрице, превышающей 128, теперь белые, и они меньше 128 или равно будут черными

Необязательно, и для меня хорошие результаты - применить размытие

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

Позже вы можете сохранить его, как было сказано ранее:

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

Ответ 5

Казалось, это сработало для меня!

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

Ответ 6

Достаточно простого двоичного порогового метода.

включить

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

Вы можете использовать GaussianBlur для получения гладкого черно-белого изображения.