이미지의 픽셀에 대하여 공부를 하였으니


이번에는 간단하게 이미지를 가지고 조작을 해보겠습니다.


먼저 이미지 하나하나가 픽셀로 이루어져 있고, 지난번 gray_image로 만드는 방법과 복사하는 방법을 보면


각각의 픽셀을 opencv를 통해 원하는대로 조종할 수 있다고 배웠습니다.


어떤 이미지가 있다면, 이 이미지 속의 랜덤한 픽셀들의 화소값을 바꾸면서 실험을 해 보겠습니다.


먼저 픽셀의 값은 흑백의 경우 0~255(0:black, 255:white) 라고 하였고, color image의 경우에는 각각의 RGB값이 0~255(8bit)를 나타내서 합쳐진다고 하였습니다.


첫번째는 먼저 랜덤한 픽셀들의 화소값을 255(white)로 바꾸도록 하겠습니다.


color 이미지의 경우에는 당연히 channels인 R, G, B가 모두 255여야지 white가 된답니다.



#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void whitespace(cv::Mat &image, int num);

void main()
{        
     cv::Mat image = cv::imread("6.jpg");
     whitespace(image, 5000);
     cv::namedWindow("output");
     cv::imshow("output", image);
     cv::waitKey(0);
}


void whitespace(cv::Mat &image, int num)
{
     for (int k = 0; k < num; k++)
     {
           int i = rand() % image.cols;
           int j = rand() % image.rows;

           if (image.channels() == 1){
               image.at<uchar>(j, i) = 255;
          }
          else if (image.channels() == 3){
               image.at<cv::Vec3b>(j, i)[0] = 255;
               image.at<cv::Vec3b>(j, i)[1] = 255;              

               image.at<cv::Vec3b>(j, i)[2] = 255;         

          }
     }
}

 



위의 소스는 불러온 이미지가 흑백사진인지(channels ==1 ) 아니면 컬러사진인지(channels == 3) 를 확인 한 후에


각각의 이미지의 행과 열에서 랜덤으로 받은 값 i,j를 통해 픽셀의 위치를 찾고, 벡터값을 이용하여 255라는 픽셀값을 넣어주었습니다.


이미지에서 보는 것과 같이 랜덤한 곳에 whitespace가 나타난 것을 알 수 있습니다.


이번에는 반대로 0의 값을 줘보겠습니다.


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void blackspace(cv::Mat &image, int num);

      

void main()
{
      cv::Mat image = cv::imread("6.jpg");
      blackspace(image, 5000);
      cv::namedWindow("output");
      cv::imshow("output", image);
      cv::waitKey(0);
}


void blackspace(cv::Mat &image, int num)
{
      for (int k = 0; k < num; k++)
      {
            int i = rand() % image.cols;
            int j = rand() % image.rows;      

            if (image.channels() == 1){
                  image.at<uchar>(j, i) = 0;
            }
            else if (image.channels() == 3){
                  image.at<cv::Vec3b>(j, i)[0] = 0;
                  image.at<cv::Vec3b>(j, i)[1] = 0;
                  image.at<cv::Vec3b>(j, i)[2] = 0;
            }
      }
}

 



다음과 같이 픽셀 조작을 해보았습니다.


by 아발로온v 2014.04.09 18:54
| 1 2 3 4 5 6 |