ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.