관심쟁이 영호

[#11]OpenCV(With.cpp) ㅣ 화소 처리 ver.1ㅣat(), ptr(), 그레이스케일, 영상의 화소값 확인 본문

학교공부/OpenCV

[#11]OpenCV(With.cpp) ㅣ 화소 처리 ver.1ㅣat(), ptr(), 그레이스케일, 영상의 화소값 확인

관심쟁이 영호 2020. 11. 14. 01:30
반응형

안녕하세요!

관심쟁이 영호입니다.

 

영상을 다루려면 기본적으로 화소에 접근하고 해당 그 값을 수정하거나 새로 만들 수 있어야 합니다!

그것을 이용하기 위해서는 화소 처리방법을 알아야 하는데요!

관련된 것들을 공부해보겠습니다!

 

1. at()

at함수는 Mat행렬에 지정된 원소에 접근하는 템플릿 함수입니다!

 

그럼 살펴볼게요!

at(int i, int j, int k,);

at(Point pt)

여기서 i, j, k는 각각 0, 1, 2차원을 가리키는 배열 인덱스입니다!

 

at함수는 타입을 꼭꼭 정해주어야 해요!!

예를 들면,

mat1.at <int>(i, j)

이렇게요!

 

여기서 만약 pt로 접근한다고 가정하면!

Point pt(열, 행)

이렇게 접근해야 합니다!

 

2. ptr()

모든 함수를 보고 한 번에 코드를 살펴볼게요!

 

ptr함수는!

지정된 행에 대한 포인터를 반환해요! 이 함수는 uchar* 혹은 해당 행렬 자료형으로 포인터를 반환합니다!

 

 

3. 그레이 스케일 영상

흑백 영상을 다루는 이야기예요!

위에 함수들과 함께 다루어 보겠습니다!

 

imread함수에 상수값으로 IMREAD_GRAYSCALE을 넘겨주면 흑백 영상으로 읽어옵니다!

 

코드를 볼게요!

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void main() {
	
	Mat image = imread("../image/sample_image2.jpg", IMREAD_GRAYSCALE);
	
	CV_Assert(!image.empty());

	Mat dst1 = image + 100; //이미지 자체에 가감연산!
	Mat dst2 = image - 100;
	Mat dst3 = 255 - image;

	Mat dst4(image.size(), image.type());
	Mat dst5(image.size(), image.type());
	
	for (int i = 0; i < image.rows; i++) //화소 단위로 접근하여 화소값 가감연산!
	{
		for (int j = 0; j < image.cols; j++)
		{
			dst4.at<uchar>(i, j) = image.at<uchar>(i, j) + 100;
			dst5.at<uchar>(i, j) = 255 - image.at<uchar>(i, j);
		}
			
	}

	imshow("원 영상", image);
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);
	imshow("dst4", dst4);
	imshow("dst5", dst5);
	
	
	waitKey(0);
}

결과를 볼게요!

 

dst4, 5는 화소에 직접 접근해서 어둡게, 밝게 한 결과입니다!

화소에 직접 접근해서 연산을 할 경우

dst4에서 255라는 범위를 뛰어넘어버려서 화면이 깨진 것이 보이네요!

 

추가로 그레이 스케일 영상을 하나 더 보겠습니다!

 

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void main() {
	
	Mat image = imread("../image/sample_image2.jpg", IMREAD_GRAYSCALE);
	
	CV_Assert(!image.empty());

	Rect roi(135, 95, 20, 15);
	Mat roi_img = image(roi);
	
	for (int i = 0; i < roi_img.rows; i++)
	{
		for (int j = 0; j < roi_img.cols; j++)
		{
			cout.width(5);
			cout << (int)roi_img.at<uchar>(i, j);
		}
		cout << endl;
	}
	
	rectangle(image, roi, Scalar(255), 1);
	
	imshow("image", image);
	
	waitKey(0);
}

사각형을 설정하고!

해당 사각형에 있는 값만 출력해보았어요!

행을 순회하면서 열을 같이 순회하는 방식!

 

 

저쪽에 보이는 네모의 값만 출력해보았어요!

 

 

잘 이해가 되실까요!?

오늘은 여기까지 해보겠습니다.

 

 

300x250
Comments