9. 컬러 영상 처리

OpenJR·2022년 4월 11일
0

컬러 영상 다루기

컬러영상의 픽셀 값 참조

Mat src = imread ("mandrill.bmp");
Mat dst(src.rows, src.cols, cV_8UC3);
for (int y = 0; y < src.rows; y++) {
    for (int x = 0; x < src.cols; x++) {
        dst.at<Vec3b>(y, x) = Vec3b(255, 255, 255) - src.at<Vec3b>(y, x);
    }
}

색공간 변환 함수

void cvtColor (InputArray src, OutputArray dst, int code, int dstCn = 0);

cvtColor(src, gray, COLOR_BGR2GRAY);

src: 입력 영상

dst: 출력 영상

code: 색 변환 코드 (OpenCV 문서 페이지 참고)

  • COLOR_BGR2GRAY / COLOR_GRAY2BGR: BGR <> GRAY
  • COLOR_BGR2RGB / COLOR_RGB2BGR: BGR <> RGB
  • COLOR_BGR2HSV / COLOR_HSV2BGR: BGR <> HSV
  • COLOR_BGR2YCrCb / COLOR_YCrCb2BGR: BGR <> YCrCb

dstCn: 결과 영상의 채널수. 0이면 자동 결정됨.

채널 분리 & 병합

void split(InputArray src, OutputArrayOfArrays mv);
void merge (InputArrayofArrays mv, OutputArray dst);

vector<Mat> planes;
split(src, planes);
merge(planes, dst);

src: (입력) 다채널 행렬

mv: (출력) or (입력) 행렬의 벡터. vector\

dst: (출력) 다채널 행렬

컬러 영상 처리 기법

컬러 히스토그램 평활화

Mat src = imread("mandrill.bmp", IMREAD_COLOR);

Mat src_ycrcb;
cvtColor(src, src_ycrcb, COLOR_BGR2YCrCb);

vector<Mat> ycrcb_planes;
split(src_ycrcb, ycrcb_planes);

equalizeHist(ycrcb_planes[0], ycrcb_planes[0]);

Mat dst_ycrcb, dst;
merge (ycrcb_planes, dst_ycrcb);
cvtColor(dst_ycrcb, dst, COLOR_YCrCb2BGR);

특정 색상 영역 추출

void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);

Mast dst_mask;
Scalar lowerb(pos_hue1, pos_sat1, 0);
Scalar upperb(pos_hue2, pos_sat2, 255);
inRange(src_hsv, lowerb, upperb, dst_mask);

src: 입력 행렬

lowerb: 하한 값 (Mat 또는 Scalar)

upperb: 상한 값 (Mat 또는 Scalar)

dst: 입력 영상과 동일 크기. cV_8UC1 타입. 범위 안에 들어가는 픽셀 값만 255로 설정됨.

히스토그램 역투영

void calcBackProject(const Mat* images, int nimages, const int* channels,
                     InputArray hist, OutputArray backProject, const float** ranges,
                     double scale = 1, bool uniform = true);

Mat ref, ref_ycrcb;
ref = imread("ref.png", IMREAD_COLOR);
mask = imread("mask.bmp", IMREAD_GRAYSCALE);
cvtColor(ref, ref_ycrcb, COLOR_BGR2YCrCb);

Mat hist
int nimages = 1;
int channels[] = { 1, 2 }; //YCRCB [0, 1, 2]
int dims = 2;
int histSize[] = { 256, 256 };
float cr_range[] = { 0, 256 };
float cb_range[] = { 0, 256 };
const float* ranges[] = { cr_range, cb_range };
calcHist(&ref_ycrcb, nimages, channels, Mat(), hist, dims, histSize, ranges);

Mat src, src_ycrcb;
src = imread("kids.png", IMREAD_COLOR);
cvtColor(src, src_ycrcb, COLOR_BGR2YCrCb);

Mat backproj;
calcBackProject(&src_ycrcb, nimanges, channels, hist, backproj, ranges);

images: 입력 영상 주소 (또는 입력 영상 배열 주소)

nimages: 입력 영상 개수

channels: 역투영 계산에 사용할 채널 목록 (배열)

hist: 입력 히스토그램

backProject: (출력) 히스토그램 역투영 결과 행렬. 입력 영상과 동일 크기, cv_8U.

  • 발생 빈도가 높으면 원소 값이 크게 나타남.

ranges: 히스토그램 빈 경계값 배열의 배열.

profile
Jacob

0개의 댓글