이진화 목차
이진화
전역 임계값 사용
‘이진화 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")