RGB를 열린 상태에서 흑백으로 변환이력서
RGB 이미지를 흑백(바이너리) 이미지로 변환하는 방법을 알고 싶습니다.
변환 후 변경된 이미지를 디스크에 저장하려면 어떻게 해야 합니까?
AFAIK, 그레이스케일로 변환한 다음 2진수로 임계값을 설정해야 합니다.
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 이미지를 그레이스케일 이미지로 변환합니다.그렇지 않으면 이전에 획득한 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);
간단한 바이너리 임계값 방식이면 충분합니다.
포함하다
#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
매끄러운 흑백 이미지를 얻을 수 있습니다.
이게 나한테 효과가 있었던 것 같아!
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 라이브러리를 사용하여 마이크로 어레이 슬라이드에 인쇄된 스폿 샘플을 검출하는 것이었습니다만, 이것을 실현하려면 , 말씀하신 대로, 화상을 칼라 ->그레이스케일 ->블랙+화이트로부터 변환할 필요가 있습니다.
이미지를 2치화하는 간단한 방법은 임계값과 비교하는 것입니다.예를 들어 매트릭스 내의 모든 요소를 c++에 opencv가 있는 값과 비교할 수 있습니다.
cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat bw = img > 128;
이렇게 하면 매트릭스 내의 128보다 큰 픽셀은 모두 흰색이며 128보다 작은 픽셀은 검은색입니다.
선택적으로, 그리고 나에게 좋은 결과를 준 것은 블러(blur)를 적용하는 것이다.
cv::blur( bw, bw, cv::Size(3,3) );
나중에 다음과 같이 저장할 수 있습니다.
cv::imwrite("image_bw.jpg", bw);
언급URL : https://stackoverflow.com/questions/1585535/convert-rgb-to-black-white-in-opencv
'programing' 카테고리의 다른 글
Linux 기반 시스템에서 c 프로그램에서 mqueue를 사용하려면 어떻게 해야 합니까? (0) | 2022.08.16 |
---|---|
Vue - html 요소를 동적으로 스타일링할 수 있습니까? (0) | 2022.08.16 |
malloc+memset이 calloc보다 느린 이유는 무엇입니까? (0) | 2022.08.16 |
[Vue warn] :알 수 없는 사용자 지정 요소: (0) | 2022.08.16 |
물리 디스크를 표시하는 방법 (0) | 2022.08.16 |