Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

OpenCV에서 포인터 방법을 사용하여 색상을 줄이는 방법은 무엇입니까?

<시간/>

이미지 처리에서는 이미지에 대한 계산을 수행합니다. 좀 더 구체적으로 말하면 픽셀에 대한 계산을 수행하므로 픽셀 수가 많을수록 계산에 더 많은 시간이 소요됩니다. 계산 시간을 줄이려면 이미지를 효율적으로 스캔해야 합니다. 포인터를 사용하여 효율적인 이미지 스캐닝 루프를 구현하는 방법을 배울 것입니다.

여기에서 색상 감소 전략의 예와 함께 픽셀 스캔 프로세스를 볼 수 있습니다. RGB 이미지와 같은 컬러 이미지는 3개의 채널로 구성됩니다. 이러한 각 채널에는 픽셀 수가 동일하지만 해당 값이 있습니다. 이 값은 각각 8비트 부호 없는 문자 값입니다.

따라서 가능한 색상의 총 수는 256 x 256 x 256 =16,777,216입니다. 각 픽셀의 값을 같은 크기의 입방체로 나누어 이 엄청난 수의 가능한 색상을 줄일 수 있습니다. 8 x 8 x 8 큐브를 사용하여 값을 나누면 가능한 색상의 수는 32 x 32 x 32 =32,768 색상이 됩니다.

색상 수가 줄어들면 시스템이 빨라집니다. 이 축소를 수행하려면 각 픽셀을 스캔해야 하며 이는 시간이 많이 소요되는 작업입니다. 그렇기 때문에 효율적인 이미지 스캔 방법이 필요합니다.

다음 프로그램은 OpenCV에서 포인터 방식을 사용하여 색상을 줄이는 방법을 보여줍니다.

예시

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;//Declaring cv namespace
using namespace std;//Declaring std namespace
void reducing_Color(Mat &image, int div=64){ //Declaring the function//
   int   total_rows = image.rows;//getting the number of lines//
   int total_columns = image.cols * image.channels();//getting the number of columns per line//
   for (int j = 0; j < total_rows; j++){ //initiating a for loop for rows
      uchar* data = image.ptr<uchar>(j);
      for (int i = 0; i < total_columns; i++){ //initiating a for loop for columns//
         data[i] = data[i] / div * div + div / 2;//processing the pixels//
      }
   }  
}
int main() {
   Mat image;//taking an image matrix//
   image = imread("grapes.jpg");//loading an image//
   namedWindow("Image Window");//Declaring another window//
   reducing_Color(image);//calling the function//
   imshow("Image Window", image);//showing the image with reduced color//
   waitKey(0);
   return 0;
}

출력

OpenCV에서 포인터 방법을 사용하여 색상을 줄이는 방법은 무엇입니까?