-
HSI 예제컴공지식/컴퓨터비전 2024. 9. 20. 00:55
다음 코드로 HSI 색상 공간을 활용하는 방법을 알아보자
코드가 좀 복잡하긴 한데 별거 아니다
int main() {
Mat image = imread("colorful.jpg"); // 이미지 파일 "colorful.jpg"를 불러옴
Mat HSV, intensity_change, mask_out, change_color; // 다양한 처리 결과를 저장할 Mat 변수들
vector<Mat> ic(3); // intensity_change에 대한 채널 벡터
vector<Mat> mo(3); // mask_out에 대한 채널 벡터
vector<Mat> cc(3); // change_color에 대한 채널 벡터
int rows = image.rows; // 이미지의 행 수
int cols = image.cols; // 이미지의 열 수
uchar* h; // hue 채널 포인터
uchar* s; // saturation 채널 포인터
uchar* v; // value 채널 포인터
cvtColor(image, HSV, CV_BGR2HSV); // BGR 이미지를 HSV로 변환
split(HSV, ic); // HSV 이미지를 분리해서 ic에 저장 (intensity_change용)
split(HSV, mo); // HSV 이미지를 분리해서 mo에 저장 (mask_out용)
split(HSV, cc); // HSV 이미지를 분리해서 cc에 저장 (change_color용)
// intensity_change 작업 (ic[2] 히스토그램 평활화)
equalizeHist(ic[2], ic[2]); // 히스토그램 평활화를 통해 밝기 개선
// 오렌지 색상 제외 (hue가 9~23 사이일 때 채도 유지, 나머지 채도는 0으로 설정)
for (int j = 0; j < rows; j++) {
h = mo[0].ptr<uchar>(j); // hue 채널
s = mo[1].ptr<uchar>(j); // saturation 채널
for (int i = 0; i < cols; i++) {
if (h[i] > 9 && h[i] < 23) // hue 값이 오렌지 범위에 있을 때
s[i] = s[i]; // 그대로 유지
else
s[i] = 0; // 나머지 색은 채도를 0으로 만들어 제거
}
}
// 모든 색상 변경 (hue 값에 50을 더하고, 179를 넘으면 순환)
for (int j = 0; j < rows; j++) {
h = cc[0].ptr<uchar>(j); // hue 채널
s = cc[1].ptr<uchar>(j); // saturation 채널
for (int i = 0; i < cols; i++) {
if (h[i] + 50 > 179) // hue 값에 50을 더했을 때 179를 넘으면
h[i] = h[i] + 50 - 179; // 순환시킴 (0부터 다시 시작)
else
h[i] += 50; // hue 값에 50을 더함
}
}
// 채널 병합
merge(ic, intensity_change); // intensity_change 채널 병합
merge(mo, mask_out); // mask_out 채널 병합
merge(cc, change_color); // change_color 채널 병합
// 병합한 이미지들을 BGR로 변환
cvtColor(intensity_change, intensity_change, CV_HSV2BGR); // intensity_change를 BGR로 변환
cvtColor(mask_out, mask_out, CV_HSV2BGR); // mask_out을 BGR로 변환
cvtColor(change_color, change_color, CV_HSV2BGR); // change_color를 BGR로 변환
// 결과 이미지 출력
imshow("image", image); // 원본 이미지
imshow("intensity change", intensity_change); // 히스토그램 평활화된 이미지
imshow("mask out", mask_out); // 오렌지 색상 제외한 이미지
imshow("change color", change_color); // 모든 색상을 변경한 이미지
waitKey(0); // 키 입력 대기
return 0;
}코드의 흐름은 다음과 같다.
이미지 불러오기 및 초기화 -> BGR → HSV 변환 및 채널 분리 -> 히스토그램 평활화 -> 특정 색상(오렌지) 제외 -> 모든 색상 변경 -> 채널 병합 -> HSV → BGR 변환 및 결과 출력
요약하자면
이 코드는 이미지를 HSV 색상 공간으로 변환한 후, 여러 가지 작업을 수행한다.
밝기를 개선하거나, 특정 색상만 남기고, 나머지 색상을 변경하는 등의 다양한 작업을 할 수 있다.
'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
White Balancing 예제 (0) 2024.09.20 Pseudo Coloring 예제 (0) 2024.09.20 Split/Merge (0) 2024.09.20 Color Conversion (0) 2024.09.20 Color Processing (0) 2024.09.20