반응형



OpenCV에서 바이너리 이미지로 변환한 후, 텍스트 파일로 저장하는 방법을 다룹니다.

이후 엑셀에서 불러와 한 셀에 하나의 픽셀값이 들어가도록 합니다.


다음 이미지를 입력으로 해서 OpenCV를 사용하여 얻은 텍스트 파일입니다.





엑셀에서 해당 텍스트 파일을 불러온 후, 너비가 일정함을 선택하고 마침 버튼을 클릭합니다.




엑셀의 셀마다 하나의 픽셀값이 저장됩니다.







파이썬과 C++로 구현한 코드입니다.



Python


import cv2 as cv


img_color = cv.imread('box_small.png', cv.IMREAD_COLOR)
img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
ret, img_binary = cv.threshold(img_gray, 150, 255, cv.THRESH_BINARY)


height,width = img_binary.shape[:2]

f = open('image.txt', 'w')

for y in range(height):
   for x in range(width):
       print("%3d"%img_binary[y,x], end=" ")
       f.write("%3d " % img_binary[y,x])
   print("")
   f.write("\n")

f.close()
cv.imshow("Binary", img_binary)
cv.waitKey(0)



C++


#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

using namespace cv;
using namespace std;


int main()
{
Mat img_color, img_gray, img_binary;

img_color = imread("box_small.png", IMREAD_COLOR);
cvtColor(img_color, img_gray, COLOR_BGR2GRAY);
threshold(img_gray, img_binary, 150, 255, THRESH_BINARY);

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

FILE * pFile = fopen("image.txt", "w");

for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
printf("%3d ", img_binary.at<uchar>(y, x));
fprintf(pFile, "%3d ", img_binary.at<uchar>(y, x));
}
printf("\n");
fprintf(pFile, "\n");

}

fclose(pFile);

imshow("Binary", img_binary);
waitKey(0);
}



최초작성 2019. 1. 28




반응형

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

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

유튜브 구독하기


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

  1. 융기원태욱 2019.04.18 20:39

    안녕하세요!!
    OpenCV로 파이썬을 공부를 막 시작한학생인데요!

    카메라로 찍은 사진을 바이너리값으로 저장을 했는데요... 너무 픽셀이 많아서 그런데
    해상도를 어떻게 줄일 수 있을까요???

  2. 파이써누 2019.05.10 10:04

    안녕하세요! 코드를 이용해서 사용하고있는데

    img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
    이 부분에서 에러가 나옵니다 ㅜㅜ

    에러 내용
    C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

    무슨 문제가 있는건가요 ㅠ?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.10 10:10 신고

      원본 이미지를 찾지못해서 나는 에러입니다.
      파이썬 코드와 같은 위치에 이미지파일을 두세요.


      그리고 다음 부분에서 파일 이름이 정확한지 다시 확인해보세요.
      img_color = cv.imread('box_small.png', cv.IMREAD_COLOR)

  3. 안녕애드라 2019.12.20 20:13

    바이너리로만 저장할수 있는건가요?
    RGB로도 픽셀 값을 저장해보고싶은데 threshold를 img_color로 하면 될까요?

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

      cvtColor와 threshold함수를 주석처리하세요. 그리고 아래 픽셀접근하는 방법 설명한 포스트 참고하여 컬러 픽셀에 접근하여 파일에 정수로 저장하면 됩니다.

      https://webnautes.tistory.com/1359

  4. 수수 2020.06.09 11:22

    안녕하세요?
    작성자님 유튜브 보면서 공부하고 있는 직장인 입니다.

    gray 이미지를 위에 설명하신 파일 형식으로 저장하고 싶은데
    코드를 실행하면 데이터가 수직방향 1열로 저장이 되는데 어떤 부분을 잘못해서 이런 결과가 나온걸까요?

    작성자님 처럼 텍스트 파일에도 위치별로 색공간 값이 나오게 하고싶습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.09 14:10 신고

      그레이스케일과 바이너리 이미지 모두 1채널 이미지라 코드 수정없이 가능할텐데 이상하네요. 그레이스케일 이미지 파일이라도 cvtColor함수를 사용해서 BGR2GRAY를 해줘야 하는 경우도 있습니다.

+ Recent posts