매트랩에 비해 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
'Dev > C, C++' 카테고리의 다른 글
[opencv와 C++로 컴퓨터 비전] 마우스로 영상 위에서 클릭한 위치와 화소 값 출력하기 (0) | 2018.01.29 |
---|---|
[opencv와 C++로 컴퓨터 비전] 영상 읽고, 띄우고, 축소하고, 좌우반전하고, 저장하기 (0) | 2018.01.29 |
C언어의 메모리 구조: 데이터(Data), 스택(Stack) 그리고 힙(Heap) 영역 (2) | 2017.10.16 |
포인터의 이해 (6) | 2017.10.09 |
[Learn opencv by examples] 8 (1). Sobel 엣지 검출 (6) | 2017.06.15 |
[Learn opencv by examples] 7. 2D 컨볼루션 / 새로운 필터 만들기 (0) | 2017.06.14 |
[Learn opencv by examples] 6. Gaussian 필터, Bilateral 필터, Median 필터 (2) | 2017.06.03 |
[Learn opencv by examples] 5. 영상 이진화, Threshold operation (0) | 2017.06.02 |