• Home
  • About
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • All Posts
    • All Tags
  • Projects

[06] OpenCV 영상처리 이진화

04 Feb 2020

Reading time ~3 minutes

Table of Contents
  • 이진화 목차
  • 이진화
  • 전역 임계값 사용
    • 함수 종류
    • 코드 설명
      • C++
      • PYTHON

이진화 목차

  • 이진화
  • 전역 임계값 사용
    • 함수 종류
    • 코드 설명
    • 객체의 색처리
    • 이진화 임계값 정하기

이진화

전역 임계값 사용

‘이진화 binarization, thresholding ’는 그레이 스케일 이미지를 바이너리 Binary 이미지로 변환 하는 방법
임계값 threshold 를 기준으로 그레이 스케일 이미지를 흰색 영역과 검은색 영역으로 분리.
[ex]
임계값이 127일 경우

  • 입력으로 사용한 이미지에서 픽셀값이 127 이하이면 검은색 (0)
  • 픽셀값이 127보다 크면 횐색 (255)으로 하여 바이너리 이미지를 생성

함수 종류

threshold함수 : OpenCV에서는 이미지 전체에 하나의 임계값 사용
adaptiveThreshold함수 : 이미지를 작은 영역으로 나누어 각 영역별로 다른 임계값 사용

코드 설명

threshold( src, dst, threshold_value, Max_value, threshold_type)

  • src : 입력할 이미지 변수 grayscale 이미지를 입력 필요
  • dst : 필터가 적용되어 저장될 이미지 변수
  • threshold_value : 임계 값 (0~255), 이진화 시킬 기준 값을 입력
  • Max_value
    임계 값 이상의 픽셀들에 적용할 값,
    0 또는 Max_value 의 두 값으로만 이미지를 표현하게 됨, 보통 255 를 사용.
  • threshold_type : 이진화 방법
    • THRESH_BINARY : 이진화, threshold 값 이상 : 1, 이하 : 0(black) 으로 처리
    • THRESH_BINARY_INV : 역 이진화
      • threshold 값 이상 : 0 (black)
      • threshold 값 이하 : 1 로 처리
      • 즉, THRESH_BINARY의 흑백을 바꿔둔 것

C++

# include < opencv2/opencv.hpp> # include < iostream>
using namespace cv;
using namespace std;
int main()
{ 
  // 이미지를 읽어옵니다.
  Mat img_color;
  img_color = imread("grayscale.png", IMREAD_COLOR);
  if (img_color.empty())
  {
    cout << "이미지 파일을 읽을 수 없습니다." << endl;
    return - 1;
  }


  // 그레이 스케일 이미지로 변환합니다.
  Mat img_gray;
  cvtColor(img_color, img_gray, COLOR_BGR2GRAY);

  // 임계값 127을 사용하여 이진화를 합니다.
  // 이진화 타입으로 THRESH_BINARY를 사용하면 // 픽셀값이 127 보다 크면 255, 127 이하이면 0이 됩니다.
  // 이진화 타입으로 THRESH_BINARY_INV를 사용하면 반대로 됩니다.
  Mat img_binary;
  threshold(img_gray, img_binary, 127, 255, THRESH_BINARY);
  // 결과 이미지를 보여줍니다.
  imshow("Grayscale", img_gray);
  imshow("Binary", img_binary);
  waitKey(0);
}
# include < opencv2/opencv.hpp> # include < iostream>
using namespace cv;
using namespace std;
// 트랙바를 위한 콜백함수입니다.
static void on_trackbar( int, void* ){
}
int main()
{ // 이미지를 읽어옵니다.
Mat img_color;
img_color = imread("red ball.png", IMREAD_COLOR);
if (img_color.empty())
{
  cout << "이미지 파일을 읽을 수 없습니다." << endl;
  return - 1;
}

// 그레이 스케일 이미지로 변환합니다.
Mat img_gray;
cvtColor(img_color, img_gray, COLOR_BGR2GRAY);
imshow("Grayscale", img_gray);

// 윈도우에 트랙바를 추가합니다.
namedWindow("Binary");
createTrackbar("threshold", " Binary", 0, 255, on_trackbar);
setTrackbarPos("threshold", " Binary", 127);

// 트랙바를 사용하여 파라미터를 조정할 OpenCV함수를 콜백함수에 // 넣는 대신 필요한 부분에 루프를 추가하여 처리합니다.
while(1)
{ // 트랙바의 값을 읽어와 threshold함수를 위한 파라미터로 // 사용합니다.
  int thresh = getTrackbarPos("threshold", " Binary");
  // 빨간색 공 영역의 픽셀값이 배경보다 작기 때문에 // THRESH_BINARY_INV를 사용하여 임계값보다 작은 영역이 // 흰색 영역이 되도록합니다.
  Mat img_binary;
  threshold(img_gray, img_binary, thresh,255, THRESH_BINARY_INV);
  // 결과 이미지를 보여줍니다.
  imshow("Binary", img_binary);
  // ESC 키를 누를 때 루프에서 빠져나오도록 합니다.
  if (waitKey(1) == 27) break;
  }
}

PYTHON

import cv2 as cv 
import sys

# 이미지를 읽어옵니다.
img_color = cv.imread("grayscale.png", cv.IMREAD_COLOR) 
if img_color is None:
 print("이미지 파일을 읽을 수 없습니다." ) 
 sys.exit(1)

# 그레이 스케일 이미지로 변환합니다.
img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)

# 임계값 127을 사용하여 이진화를 합니다.
# 이진화 타입으로 THRESH_BINARY를 사용하면 # 픽셀값이 127 보다 크면 255, 127 이하이면 0이 됩니다.
# 이진화 타입으로 THRESH_BINARY_INV를 사용하면 반대로 됩니다.
retval,img_binary = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)

# 결과 이미지를 보여줍니다.
cv.imshow('Grayscale', img_gray) 
cv.imshow('Binary', img_binary) 
cv.waitKey(0)


## 객체의 색처리
바이너리 이미지에서 **객체가 흰색**이 되도록 해야 함.  
* 이진화 이후 사용되는 OpenCV함수들이 처리 시 흰색 영역을 대상으로 하기 때문.   
* 즉 객체와 배경의 색이 반전되어 나왔다면  [THRESH_BINARY_INV  : 역 이진화](#THRESH_BINARY_INV) 이용  

## 이진화 임계값 정하기
이진화를 위한 임계값을 정할 때 앞에서 살펴본 **트랙바를 사용** 가능  
1) 트랙 바를 사용하여 임계값을 찾은 후,   
2) threshold함수를 위한 고정된 값으로 사용  

+ ```sys.exit()``` :sys.exit는 Ctrl+Z나 Ctrl+D를 눌러서 대화형 인터프리터를 종료하는 것과 같은 기능을 한다. 프로그램 파일 안에서 사용하면 프로그램을 중단시킨다.
import cv2 as cv 
import sys

# 트랙바를 위한 콜백함수입니다.
def on_trackbar(x):
 pass
 
# 이미지를 읽어옵니다.
img_color = cv.imread("red ball.png", cv.IMREAD_COLOR) 
if img_color is None:
 print("이미지 파일을 읽을 수 없습니다." ) 
 sys.exit(1)

# 그레이 스케일 이미지로 변환합니다.
img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) 
cv.imshow('Grayscale', img_gray)

# 윈도우에 트랙바를 추가합니다.
cv.namedWindow("Binary")


OpenCV Share Tweet +1