dev-logs

3. MFC를 이용한 viewer 만들기_RGB를GRAY로 본문

공부/영상처리

3. MFC를 이용한 viewer 만들기_RGB를GRAY로

두룹두두 2017. 12. 15. 18:03

이미지파일 불러오는 걸 이전까지 했는데요.

이번에는 불러온 rgb이미지를 gray이미지로 변환하는 걸 구현하겠습니다.







메뉴에 Convert Gray 항목을 추가했구요, 우클릭해서 이벤트를 추가합니다.







잘못캡쳐됐는데, 클래스목록은 CViewerDlg로 놓고 추가해주세요~!

저는 함수이름도 OnConvertgrayBtnClick() 으로 변경했습니다.











RGB는 한픽셀당 3비트인데 각각의 비트에는 B, G, R 순서대로 값이 들어갑니다.
gray로 바꾸는 부분에 for문 안에서 rgb 값을 정의해줄때 rgb 구조를 잘 생각할것!






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void CViewerDlg::OnConvertgrayBtnClick()
{
    if (InpImg.data != NULL)
    {
        //변환한 gray이미지를 담을 공간 할당하기
        GrayImg = new unsigned char*[InpImg.rows];
        for (int h = 0; h < InpImg.cols; h++)
        {
            GrayImg[h] = new unsigned char[InpImg.cols];
        }
    
 
        // gray로 바꾸기
        for (int h = 0; h < InpImg.rows; h++)
        {
            for (int w = 0; w < InpImg.cols; w++)
            {
                unsigned char r, g, b;
                r = InpImg.at<unsigned char>(h, w * 3 + 2);
                g = InpImg.at<unsigned char>(h, w * 3 + 1);
                b = InpImg.at<unsigned char>(h, w * 3); //bgr순서이다. 한픽셀당 3비트여서 곱하기3
                GrayImg[h][w] = 0.299 *+ 0.587*+ 0.114*b;
            }
        }
 
        //Display
        OutImg = Mat(InpImg.cols, InpImg.rows, CV_8UC1);
        
        for(int h = 0; h < OutImg.rows; h++)
        {
            for (int w = 0; w < InpImg.cols; w++)
            {
                GrayImg[h][w] = OutImg.at<unsigned char>(h, w);
            }
        }
 
        
        for (int n = 0; n < InpImg.rows; n++)
        {
            delete[]GrayImg[n];
        }
        delete[] GrayImg;
 
        imshow("OutImg", OutImg);
 
    }
}
cs





먼저 File Open 에서 파일을 불러온뒤 gray로 변환한 결과화면입니다.


Comments