2017-07-05 12:15:41

매트랩에 비해 opencv에서는 픽셀 값들을 보고 확인하는 것이 참 불편한 것 같다. 


일단 그레이 영상에서 이미지 픽셀에 접근하는 방법은 아래와 같다. 


img.at<uchar>(y, x


여기서 img에는 이미지 이름을 넣어주고, (y, x)에는 픽셀 위치를 넣어준다. 행, 열 순서로 넣어준다. 말로만 하면 항상 이해가 잘 안되니 아래 코드와 구현 결과를 살펴보자. 


#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"


using namespace cv;

using namespace std;


int main()

{

Mat img;

img = imread("b2w.bmp", 0);

imshow("b2w", img);


int intensity1 = img.at<uchar>(200, 100); // (200, 100)의 픽셀값

int intensity2 = img.at<uchar>(200, 300); // (200, 300)의 픽셀값

int intensity3 = img.at<uchar>(200, 500); // (200, 500)의 픽셀값


printf("%d %d %d \n", intensity1, intensity2, intensity3);


waitKey(0);

return 0;

}


그림 1. 그레이 영상 픽셀값 접근 결과

그림 1에서 보다시피 검정에서 흰색으로 점차적으로 변하는 이미지에서 (200, 100) 위치의 픽셀값은 43, (200, 300) 에서는 128, (200, 500) 에서는 213임을 확인할 수 있다. 참고로 0은 완전한 검정색이고 255는 완전한 흰색이다. 


이번에는 컬러 영상에서 픽셀값을 접근해보자. 방법은 아래와 같다. 


img.at<Vec3b>(y, x)[0]

img.at<Vec3b>(y, x)[1]

img.at<Vec3b>(y, x)[2]


B, G, R 순서로 저장되어 있음을 유의하자. 코드와 구현 결과를 보자. 


#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"


using namespace cv;

using namespace std;


int main()

{

Mat img;

img = imread("hee.jpg");

imshow("hee", img);


int intensity_b = img.at<Vec3b>(200, 300)[0]; // blue channel

int intensity_g = img.at<Vec3b>(200, 300)[1]; // green channel

int intensity_r = img.at<Vec3b>(200, 300)[2]; // red channel

printf("%d %d %d \n", intensity_b, intensity_g, intensity_r);


waitKey(0);

return 0;

}


그림 2. 컬러 영상 픽셀값 접근 결과


지금 화살표가 가리키고 있는 위치 (200, 300)에서의 B, G, R 채널의 픽셀값들은 각각 59, 46, 30이다. 


이번엔 행 단위로 픽셀값들을 확인해보는 코드를 짜봤다. 알고 싶은 범위의 행 값들을 입력해주면 그 범위 내의 픽셀들의 픽셀값들을 보여준다.


#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"


using namespace cv;

using namespace std;


int main()

{

Mat img;

img = imread("b2w.bmp", 0);

imshow("b2w", img);

waitKey(0);


int M, N;

M = img.rows;

N = img.cols;


printf("이미지 사이즈: %d x %d \n", M, N);


int row1, row2;

printf("픽셀값들을 알고 싶은 행들의 범위, 두 개의 행 값 입력 >> ");

scanf("%d %d", &row1, &row2);

printf("\n %d 행부터 %d 행까지의 픽셀값들 >> \n", row1, row2);

for (int i = row1; i <= row2; i++)

{

printf("<row %d> \n", i);

for (int j = 0; j < N; j++)

{

printf("%d ", img.at<uchar>(i, j));

}

printf("\n\n");

}



return 0;

}


그림 3. 행단위 픽셀값 확인




<참고 자료>

[1] http://eehoeskrap.tistory.com/34

[2] http://visionprogrammer.tistory.com/7