반응형



imwrite 함수로 저장하면 바이너리 이미지라도 그레이스케일(8비트 1채널) 이미지로 저장됩니다.








imwrite 사용시 IMWRITE_PNG_BILEVEL 옵션을 추가해주면 1비트 1채널 이미지로 저장할 수 있습니다.

1비트 이기 때문에  0과 1 두가지만 표현가능합니다.  png 확장자를 가지는 이미지만 가능합니다.





다음은 Python과 C++구현한 코드입니다.



Python


import cv2 as cv


img_color = cv.imread('test.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)


cv.imwrite('1bit_image.png' ,img_binary, [cv.IMWRITE_PNG_BILEVEL, 1])
cv.imwrite('8bit_image.png' ,img_binary)

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




C++


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

using namespace cv;
using namespace std;


int main()
{
Mat img_color, img_gray, img_binary;
img_color = imread("test.png", IMREAD_COLOR);
cvtColor(img_color, img_gray, COLOR_BGR2GRAY);
threshold(img_gray, img_binary, 150, 255, THRESH_BINARY);

vector<int> params;
params.push_back(IMWRITE_PNG_BILEVEL);
params.push_back(1);
imwrite("1bit_image.png", img_binary, params);
imwrite("8bit_image.png", img_binary);

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



최초 작성 2019. 1. 28



반응형

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

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

유튜브 구독하기


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

  1. sehan 2020.03.13 13:44

    관심있게 보고 있습니다. 혹시 png 파일이 아니라 .tif 이미지는 비트수준 1로 낮출수는 없나요?

    현재 파일이 수직, 수평 해상도 360DPI 이고 1 비트 수준인데 resize시 수직,수평해상도 96 DPI로 비트 수준은 8로 변경되어서 문의 드립니다.


    String filepath("original_test.tif");
    Mat ori_image = imread(filepath, IMREAD_UNCHANGED);

    Mat resized_image;
    resize(ori_image, resized_image, Size (300,300));

    이렇게 코드 쓰고 있는데 해상도와 비트수준이 변경되어서 한번 여쭤봅니다..

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

      아마도 OpenCV의 resize함수가 바이트 단위로 이미지를 변환하기 때문인듯 싶습니다. 비트 수준으로 하려면 로우 레벨로 접근해야 할듯합니다.

    • sehan 2020.03.16 15:51

      우선 제가 프로그래밍 초보라서 죄송합니다...
      그럼 혹시 다른 함수 어떤것이 있는지 추천해주실 수 있으신가요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.17 09:41 신고

      관련 함수는 없는 걸로 알고 있습니다.

      다음 포스트를 참고하여 비트 단위로 접근하도록 수정해서 진행해야 할듯합니다.

      https://webnautes.tistory.com/1169

    • sehan 2020.03.17 12:36

      답글 감사합니다.

      opencv 에서 이미지를 읽을때
      grayscale 로 읽거나 저장한다고 해도

      img_grayscale(height, width, CV_8UC1);

      'CV_8UC1'때문에 픽셀의 값을 8unit으로 밖에 못줄이는 것 같습니다.

      2unit 으로 변환하는 것이 최종 목적인데 픽셀 값을 직접 정해주는 것을 몰라서 더이상 진행을 못하는 것 같아요.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.17 12:42 신고

      현재는 PNG만.가능한듯 합니다

+ Recent posts