program tip

OpenCV에서 RGB를 흑백으로 변환

radiobox 2020. 11. 20. 08:51
반응형

OpenCV에서 RGB를 흑백으로 변환


RGB 이미지를 흑백 (바이너리) 이미지로 변환하는 방법을 알고 싶습니다.

변환 후 수정 된 이미지를 디스크에 어떻게 저장할 수 있습니까?


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에서는 다음을 수행 할 수 있습니다 (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);

이것은 나를 위해 일한 것 같았습니다!

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

블로그 게시물 중 하나에서 비슷한 작업을합니다 . 간단한 C ++ 예제가 표시됩니다.

목표는 마이크로 어레이 슬라이드에 인쇄 된 스폿 샘플을 감지하기 위해 오픈 소스 cvBlobsLib 라이브러리 를 사용하는 것이었지만,이를 달성하려면 앞서 언급했듯이 이미지를 컬러-> 회색조-> 검정 + 흰색으로 변환해야합니다.


이미지를 "이진화"하는 간단한 방법은 임계 값과 비교하는 것입니다. 예를 들어 행렬의 모든 요소를 ​​C ++의 opencv를 사용하여 값과 비교할 수 있습니다.

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

In this way, all pixels in the matrix greater than 128 now are white, and these less than 128 or equals will be black

Optionally, and for me gave good results is to apply blur

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

Later you can save it as said before with:

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

Simple binary threshold method is sufficient.

include

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

You can use GaussianBlur to get a smooth black and white image.

참고URL : https://stackoverflow.com/questions/1585535/convert-rgb-to-black-white-in-opencv

반응형