ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.