관심쟁이 영호
[#11]OpenCV(With.cpp) ㅣ 화소 처리 ver.1ㅣat(), ptr(), 그레이스케일, 영상의 화소값 확인 본문
[#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);
}
사각형을 설정하고!
해당 사각형에 있는 값만 출력해보았어요!
행을 순회하면서 열을 같이 순회하는 방식!
저쪽에 보이는 네모의 값만 출력해보았어요!
잘 이해가 되실까요!?
오늘은 여기까지 해보겠습니다.
'학교공부 > OpenCV' 카테고리의 다른 글
[#13] OpenCV(With. c++)ㅣ컬러공간 변환! ㅣRGB, CMY (0) | 2020.11.16 |
---|---|
[#12] OpenCV(With. c++)ㅣ 히스토그램! , calcHist(), cvtColor(), (0) | 2020.11.15 |
[#10] OpenCV(With. C++) ㅣ Vector클래스, Range클래스, Mat클래스 기타 메서드 (0) | 2020.11.13 |
[#8] OpenCV (With. c++)ㅣ RotatedRect 클래스, Matx클래스 (0) | 2020.11.11 |
[#7.1]OpenCV (With. c++) ㅣ 기본 행렬 연산 함수! (0) | 2020.11.10 |