반응형

 

OpenCV에서 이미지의 픽셀에 접근하는 방법을 픽셀 개념부터 설명합니다.

 

 

 

 

추가로 C++에서 OpenCV 이미지의 픽셀에 접근하는 방법을 비교 소개하고 있는 다음 글도 참고하세요.

 

OpenCV C++ 강좌 - 4. Mat에 저장된 이미지 픽셀 값에 접근하는 방법 비교

https://webnautes.tistory.com/1169

 

 

 

반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. ㅈㄴㄱㄴ 2019.07.18 18:18

    오픈씨븨 강좌 수강중이신가요?
    컬러픽셀 액세스는 vec3b로 하면 되고
    컬러2그래이는 바율이 잘못 되었습니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.18 18:46 신고

      1. vec3b를 사용하려면 at을 사용해야 하지 않나요? 속도가 느려서 잘 사용하지 않습니다.

      2. 그레이스케일 변환하는 방법은 여러가지가 있는데 그중 가장 간단한 방법입니다


    • ㅈㄴㄱㄴ 2019.07.18 19:22

      1. ptr이든 이터레이터든 뭐든 사용가능하구요
      2. 컬러2그레이에는 한 가지 방법밖에 없어요
      부동소수점연산을 덜 사용하라든지 비트연산을 이용하라든지의 구현방법 이야기가 아니라, 결과이미지의 내용이 바뀌는 팩터 이야기에요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.18 19:40 신고

      답글 달아주셔서 감사합니다.
      궁금한 점이 생겨서 답글을 달아봅니다.


      1. 혹시 ptr에서 vec3b를 사용하면 얻는 이점이 있나요?


      2. 그레이스케일 영상으로 변환시 RGB 채널의 평균값을 보통 다음 방법을 사용하지만..
      Gray = (Red + Green + Blue) / 3

      다음처럼 각 채널별로 비율을 다르게해서 사용하는 경우도 있어서 여러가지 방법이 있다고 얘기한 겁니다..
      Gray = (Red * 0.3 + Green * 0.59 + Blue * 0.11)

      제 알고있던 것이 틀릴 수도 있겠군요..

      컬러에서 그레이스케일로 변환하는 방법이 하나라고 하셨는데 어떤건지 좀더 자세히 알려주실 수 있나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.18 19:45 신고

      찾아보니 vecb3을 다음처럼 사용하는 군요..
      vecb3를 사용하고 안하고는 구현 방식이 차이일 뿐인거 같습니다.


      for(int r = 0; r < image.rows; r++) {
      // We obtain a pointer to the beginning of row r
      cv::Vec3b* ptr = image.ptr<cv::Vec3b>(r);

      for(int c = 0; c < image.cols; c++) {
      // We invert the blue and red values of the pixel
      ptr[c] = cv::Vec3b(ptr[c][2], ptr[c][1], ptr[c][0]);
      }
      }

    • ㅈㄴㄱㄴ 2019.07.18 20:14

      1. 얻는 이점은 사실상 없습니다. 하지만 vec3b의 존재 이유에 대해서 생각해보세요

      2. 도대체 어느 조직에서 각 채널의 평균값을 그레이 인텐서티로 쓰길래 보통이란 말씀을 하시는지 모르겠네요. 그건 확실하게 틀린 방법이고 아래에 적으신 비율대로 변환하는 게 맞는 방법입니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.18 20:25 신고

      1. vec3b를 사용하면 묶어서 값을 사용할 수 있어 편할지 모르지만 픽셀 접근 원리를 이해하는데에는 로우레벨이 더 좋지 않나 싶습니다.

      제 글은 실무를 위한 글이 아닙니다.


      2. 실무에서는 안쓸지 모르지만 인터넷을 찾아보면 다음처럼 종종 보입니다.

      처음 이 분야를 접하는 사람에게는 나쁘지 않다고 봅니다.

      이 글을 쓴분도 성능이 안좋다하지 틀리다라는 말은 안합니다.

      http://www.tannerhelland.com/3643/grayscale-image-algorithm-vb6/

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.18 20:31 신고

      그리고 언급한 링크의 글에 보면 그레이스케일 변환 공식이 여러 개 나옵니다.

      어떤 방식이 적용하는 분야에 좋은 결과를 보여주는지에 따라 선택해서 사용하지 않나 싶습니다.



    • ㅈㄴㄱㄴ 2019.07.18 21:28

      1. 실무를 위한 글이 아니면 가장 정석적인 내용을 담고 있어야 하는 거 아닌가요
      2. 실무를 위한 글이 아닌데 속도 이슈를 꺼낸 건 왜죠. at이 가장 이해하기 쉬울 텐데요
      3. 틀렸다고 한 건 제가 잘못했습니다. 감성적인 회색영상을 얻는 방법은 여러 가지죠. 그렇지만 영상처리분야에서 컬러2그레이 컨버팅의 정석비율은 정해져있습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.18 22:00 신고

      1. 정석도 같이 언급 안한건 제 잘못이긴 하지만 처음부터 수식이 많은 것만 알려주면 자칫 무슨 의도인지 모르고 수식을 그대로 사용할 가능성이 높지 않을까 싶습니다.

      RGB 채널을 평균내면 그레이스케일 영상이 된다는 것을 알게되면

      이후 RGB 채널별로 비율을 적은 수식을 보더라도 짐작하지 않을까 싶습니다. 성능 향상을 위해 각 채널별로 비율을 다르게 하기도 하는구나라고

      실무가 아니라면 정교한 작업은 거의 없기에 RGB 채널의 평균을 그레이스케일로 사용한다고 크리티컬한 문제가 발생하지는 않을 듯합니다.


      2. vec3b를 at에서만 사용하는줄 알았기 때문입니다. 제가 몰라서 그런거죠..그리고 포스트에서 ptr을 사용한 것은 제가 아는 픽셀 접근 방법 중에 처음 접한 사람이 사용했을 때 속도나 이해하는데 무난한 방법을 선택한 것 입니다.


      3. 단순한 방식으로 우선 배우고 이후 정교한 방식을 접하면 좋지 않을까 싶습니다.

      평균내는 방법을 알려주면서 다른 방식도 있다는 것을 언급해야 하겠지만요...

      그레이스케일 변환 방법만 따로 다루어야 봐야 할듯합니다. 어떻게 할지는 고민해봐야 겠습니다.

      오랜 시간 답글을 달아주셔서 감사합니다.



  2. 나그네 2019.11.26 15:33

    좋은 의도로 포스팅하시는데 딱히 태클걸만한 내용은 아닌듯 싶네요

  3. yow7070 2020.05.15 15:58

    안녕하세요 이미지파일의 픽셀값을 숫자로 확인하는 방법은 없나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.15 16:07 신고

      변수값을 화면에 출력하거나 텍스트 파일에 저장하면 됩니다

    • yow7070 2020.05.17 09:25

      안녕하세요 답변 정말 감사합니다!
      그레이스케일의 경우에서는
      gray = (int(b) + int(g) + int(r)) / 3.0

      이 gray값을 출력하면 되는거 맞나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.17 09:27 신고

      아래.링크에 있는 2번째 방법을 사용하세요

      https://tannerhelland.com/2011/10/01/grayscale-image-algorithm-vb6.html

    • yow7070 2020.05.18 14:37

      안녕하세요 답변 정말 감사합니다! 말씀해주신 2번방법을 통해서 grayimage를 추출이 가능한데 pointer_output[x]의pixel값을 imshow를 통해서 추출하는 방법을 모르겠어요 grayimage의 각각의 픽셀 값을 이미지파일로 띄우고 싶은데 어떻게해야하는지 알려주실 수 있나요?
      int main()
      {
      Mat img_color = imread("kakao.jpg");


      int height = img_color.rows;
      int width = img_color.cols;


      Mat img_grayscale(height, width, CV_8UC1);


      for (int y = 0; y < height; y++) {

      uchar* pointer_input = img_color.ptr<uchar>(y);
      uchar* pointer_ouput = img_grayscale.ptr<uchar>(y);
      for (int x = 0; x < width; x++) {

      // 컬러영상의 경우 픽셀값 읽어오기
      uchar b = pointer_input[x * 3 + 0];
      uchar g = pointer_input[x * 3 + 1];
      uchar r = pointer_input[x * 3 + 2];

      //그레이스케일의 경우 픽셀값 저장하기
      pointer_ouput[x] = r * 0.3 + g * 0.59 + b * 0.11;

      }
      }


      imshow("color", img_color);
      imshow("grayscale", img_grayscale);


      waitKey(0);


      return 0;
      }

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.18 20:20 신고

      픽셀값을 숫자로 출력하려는 건가요?

    • yow7070 2020.05.21 09:28

      네 pixel 값을 숫자로 확인하고싶습니다!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.21 09:31 신고

      텍스트 파일로 저장하세요

  4. yonghyunpark 2020.09.18 17:12

    강의 잘 듣고있습니다!
    mac으로 Visual studio code로 수업을 따라 하고 있긴한데
    #include <opencv2/opencv.hpp> 여기서 에러가 뜨고 #include 오류가 검색되었습니다.
    (includePath를 업데이트하세요. 이 변환 단위(/Users/yonghyunpark/tensorflow/pixel.cpp)에는 물결선을 사용할 수 없습니다.)
    (파일 소스을(를) 열 수 없습니다. "opencv2/opencv.hpp")
    이렇게 뜨는데 어떻게 해결해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.18 22:08 신고

      다음 포스트의 4-3부터 참고하세요. https://webnautes.tistory.com/1158

  5. ㅇㅇ 2020.10.26 12:39

    잘보고 갑니다.
    위에 ㅈㄴㄱㄴ 말투가 왜 저리 시비조인지 보는 제가 명치 때리고 싶네요

  6. 2020.11.23 17:20

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.23 18:02 신고

      빈 이미지를 만든후. 픽셀단위로 이동하며 문자보고 하나씩 픽셀을 기록하면 됩니다.

    • 2020.11.24 11:11

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.24 11:26 신고

      OpenCV로 빈 이미지를 저장할 Mat 객체(c++) 또는 넘파이 배열(python)을 만들면 0으로 채워져서 검은색으로 보일겁니다. 사정상 포스트 작성은 어렵습니다

    • 2020.11.24 11:28

      비밀댓글입니다

+ Recent posts