-
convertTo 함수컴공지식/컴퓨터비전 2024. 8. 31. 15:22
convertTo 함수는 OpenCV에서 Mat 객체, 즉 이미지나 행렬의 데이터를 다른 자료형으로 변환하거나, 픽셀 값의 스케일링을 할 때 사용된다.
자료형 변환: 예를 들어, 8비트 이미지(CV_8U)를 32비트 부동소수점 이미지(CV_32F)로 변환
스케일링: 픽셀 값에 특정한 스케일을 적용하거나, 값을 조정할 때
함수의 시그니처는 다음과 같다
void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0);
OutputArray m: 변환된 결과가 저장될 출력 행렬이다. 원본 Mat 객체(this)와 다른 타입으로 변환된 결과가 여기에 저장된다.
int rtype: 변환할 자료형(type)을 지정한다. 예를 들어, CV_8U, CV_32F, CV_64F 등 다양한 자료형이 있다.
double alpha=1: 스케일링 계수다. 이 값은 원본 행렬의 각 요소에 곱해질 값이다. 예를 들어, alpha를 2로 설정하면 원본 픽셀 값이 두 배로 스케일링된다.
double beta=0: 편향 계수(bias)다. 이 값은 원본 행렬의 각 요소에 더해질 값이다. 예를 들어, beta를 50으로 설정하면 모든 픽셀 값에 50이 더해진다.
다음은 예시 코드다.
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat src = cv::Mat::ones(3, 3, CV_8U) * 50; // 3x3 행렬, 값은 모두 50으로 초기화 (unsigned 8-bit)
cv::Mat dst;
// src 행렬을 32비트 부동소수점으로 변환하고, 모든 값에 2를 곱하고 10을 더함
src.convertTo(dst, CV_32F, 2.0, 10.0);
std::cout << "원본 행렬 (CV_8U):\n" << src << std::endl;
std::cout << "변환된 행렬 (CV_32F):\n" << dst << std::endl;
return 0;
}여기서 dst는 CV_32F로 변환되고, 각 값에 2를 곱한 뒤 10을 더하여 각 요소는 (50 * 2.0) + 10.0 = 110.0이 된다.
출력은 다음과 같다
원본 행렬 (CV_8U):
[50, 50, 50;
50, 50, 50;
50, 50, 50]
변환된 행렬 (CV_32F):
[110, 110, 110;
110, 110, 110;
110, 110, 110]이렇게 픽셀 값을 조정하는 이유가 뭘까?
1. 표시 및 출력 : 디지털 이미지는 보통 8비트로 표현되는데, 이때 픽셀 값은 0에서 255 사이의 값을 가져야 한다.
만약 이미지 처리 과정에서 픽셀 값이 이 범위를 벗어나게 되면, 이미지가 제대로 표시되지 않을 수 있다.
2. 명암 대비 조정 : 이미지의 밝기와 대비를 조정할 때, 픽셀 값의 범위를 조정해줄 필요가 있다.
alpha 와 beta 값을 사용해 스케일링하고, 픽셀 값을 재조정하면 밝기를 올리거나 낮추고, 명암 대비를 조정할 수 있다.
예를 들어, 모든 픽셀 값에 같은 값을 더해주면 이미지가 더 밝아지고, 반대로 빼주면 어두워진다.
3. 이미지 정규화 : 이미지를 분석하거나, 다른 알고리즘에 입력하기 전에 정규화 작업이 필요할 수 있다. 정규화는 모든 값이 일정한 범위 내에 들어가도록 조정하는 작업이다.
예를 들어, 머신 러닝 모델에 이미지를 입력할 때, 픽셀 값을 0에서 1 사이의 값으로 정규화하는 경우가 많다.
4. 연산 안정성 : 이미지 처리에서 연산이 일어날 때, 픽셀 값이 너무 크거나 작으면 계산의 정확도가 떨어질 수 있다. 특히, 부동소수점 연산에서 오버플로우나 언더플로우가 발생할 수 있다.
그 외에도 히스토그램 평활화, Thresholding 같은 특정 기능을 구현하기 위한 조정을 할 수 있다.
'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
픽셀의 값이 바뀐다는 건 뭘까? (0) 2024.08.31 setTo 함수 (0) 2024.08.31 resize 함수 (0) 2024.08.31 waitKey 함수 (0) 2024.08.31 VideoCapture::get(int propId) (0) 2024.08.31