Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

OpenCV에서 'at' 메서드를 활용한 픽셀 값 변경 방법 완벽 가이드

이미지 처리에서 픽셀 값의 구조는 이미지 종류에 따라 다릅니다. 그레이스케일(흑백) 이미지의 경우 각 픽셀은 단일 숫자 값으로 표현되지만, RGB와 같은 컬러 이미지에서는 하나의 픽셀이 세 개의 값으로 이루어진 벡터 형태를 가집니다. 이 세 개의 값은 각각 파란색(B), 초록색(G), 빨간색(R) 채널을 나타냅니다.

OpenCV에서는 at() 메서드를 사용하여 특정 위치의 픽셀에 직접 접근하고 값을 수정할 수 있습니다. 이 글에서는 그레이스케일 이미지와 RGB 이미지 모두에서 픽셀 값에 접근하여 무작위로 노이즈를 추가하는 함수를 만들어 보겠습니다. 그리고 main() 함수 안에서 해당 함수를 호출하여 실제 결과를 확인합니다.

다음 프로그램은 OpenCV에서 'at' 메서드를 사용하여 픽셀 값을 변경하는 방법을 보여줍니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;//cv 네임스페이스 선언
using namespace std;
void adding_Noise(Mat& image, int n){ //'adding_Noise' 함수//
   for (int x = 0; x < n; x++){ //반복문 시작//
      int i = rand() % image.cols;//무작위 열(column) 접근//
      int j = rand() % image.rows;//무작위 행(row) 접근//
      if (image.channels() == 1){ //그레이스케일 이미지에 노이즈 적용//
         image.at<uchar>(j, i) = 0;//픽셀 값 변경//
      }
      if (image.channels() == 3){ //RGB 이미지에 노이즈 적용//
         image.at<Vec3b>(j, i)[0] = 0;//첫 번째 채널 값 변경//
         image.at<Vec3b>(j, i)[1] = 0;//두 번째 채널 값 변경//
         image.at<Vec3b>(j, i)[2] = 0;//세 번째 채널 값 변경//
      }
   }
}
int main() {
   Mat image;//이미지 행렬 선언//
   Mat unchanged_Image;//변경되지 않은 이미지용 행렬 선언//
   image = imread("sky.jpg");//이미지 불러오기//
   unchanged_Image = imread("sky.jpg");//동일한 이미지 불러오기//
   namedWindow("Noisy Image");//윈도우 선언//
   namedWindow("Unchanged Image");//다른 윈도우 선언//
   adding_Noise(image, 4000);//'adding_Noise' 함수 호출//
   imshow("Noisy Image", image);//노이즈가 적용된 이미지 출력
   imshow("Unchanged Image",unchanged_Image);//원본 이미지 출력//
   waitKey(0);//키 입력 대기//
   destroyAllWindows();//할당된 메모리 반환
   return 0;
}

코드 동작 원리

adding_Noise() 함수: 매개변수로 이미지 행렬과 노이즈를 추가할 횟수(n)를 받습니다. 반복문 안에서 rand() 함수를 통해 무작위 좌표(i, j)를 생성합니다. 이때 image.colsimage.rows로 나머지 연산을 하여 좌표가 이미지 범위를 벗어나지 않도록 합니다.

채널 수에 따른 분기 처리: image.channels() 메서드로 이미지의 채널 수를 확인합니다. 채널 수가 1이면 그레이스케일 이미지이므로 at<uchar>(j, i)로 단일 픽셀 값에 접근하고, 채널 수가 3이면 컬러 이미지이므로 at<Vec3b>(j, i)로 접근한 후 인덱스 [0], [1], [2]를 사용하여 각 채널의 값을 개별적으로 변경합니다.

main() 함수: 원본 이미지와 비교할 수 있도록 같은 이미지를 두 개의 행렬에 각각 불러옵니다. 그중 하나에만 노이즈를 적용한 뒤, 두 이미지를 나란히 화면에 출력하여 차이를 시각적으로 비교할 수 있게 합니다.

실행 결과

OpenCV에서  at  메서드를 활용한 픽셀 값 변경 방법 완벽 가이드

실행 결과를 보면 오른쪽 원본 이미지는 그대로 유지되고, 왼쪽 이미지에는 4000개의 무작위 위치에 검은색 픽셀이 삽입되어 노이즈가 발생한 것을 확인할 수 있습니다. 이처럼 'at' 메서드를 활용하면 이미지의 특정 픽셀 값에 손쉽게 접근하고 수정할 수 있습니다.