
이진화를 하는 이유
-> 데이터 용량 감소: 데이터 크기를 줄여 저장공간과 전송 시간 절약
-> 처리 속도 향상: 흑백으로 되어 있어, 복잡한 연산 없이 빠르게 이미지 처리 가능
-> 특징 강조: 특정 요소나 형상을 두드러지게 만들어, 패턴 인식이나 객체 감지에 유용
-> 잡음 제거: 색상의 복잡성을 줄여, 이미지에서 불필요한 정보나 잡음 제거
-> 텍스트 인식 용이: 문서 스캔이나 OCR과 같은 작업에서 배경과 텍스트를 명확하게 구분
이진화 과정
image = cv2.imread('example_512.png')
# 그레이스케일로 변환
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 이진화 (임계값 127, 최대값 255, 이진화 타입)
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)


image = cv2.imread('godard_512.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

이진화된 이미지에 적용되며, 객체의 형태를 변형하고 분석하는데 사용
주요 연산
-> 침식: 객체의 경계를 축소, 작은 백색 잡음을 제거하거나 객체를 분리하는데 유용
-> 팽창: 객체의 경계를 확장, 침식으로 인해 사라진 객체의 정보를 복구
-> 열기: 침식 후 팽창 적용, 작은 객체나 돌출부 제거에 효과적
-> 닫기: 팽창 후 침식 적용, 작은 홀이나 간격 채우는데 사용
-> 모폴로지 그레이디언트: 팽창과 침식의 차이의 나타냄, 객체의 윤곽 강조하는데 사용
Dot, Hole 그림
src = np.full((500, 500), 0, dtype=np.uint8)
cv2.putText(src, 'HAM', (50, 300), cv2.FONT_HERSHEY_SIMPLEX, 6, 255, 20, cv2.LINE_AA)
noise = np.random.randint(0, 2, (500, 500)).astype(np.uint8) * 255
dot_image = cv2.bitwise_or(src, noise)
hole_image = cv2.bitwise_and(src, noise)

# 구조 요소 정의 (5x5 크기의 정사각형 커널)
kernel = np.ones((5, 5), np.uint8)
# 모폴로지 연산 적용
erosion = cv2.erode(dot_image, kernel, iterations=1)
dilation = cv2.dilate(hole_image, kernel, iterations=1)
opening = cv2.morphologyEx(dot_image, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(hole_image, cv2.MORPH_CLOSE, kernel)

필터링: 이미지의 특정 특성을 강조하거나 감소시키기 위해 사용
-> 이미지의 세부 사항과 텍스처를 줄이는데 효과적, 노이즈 제거나 배경 분리에 유용
필터링 기법
-> 일반 블러: 이미지를 부드럽게
-> 가우시안 블러: 일반 블러보다 더 자연스러운 결과 제공
-> 미디언 블러: 소금-후추 노이즈와 같은 무작위 노이즈 제거에 사용
-> 양방향 필터: 노이즈를 제거하면서도 가장자리를 보존

일반 블러: 커널내의 모든 픽셀의 평균값을 계산하여 중심 픽셀의 값을 이 평균값으로 대체
blur = cv2.blur(noisy_image, (3,3))

gaussian_blur = cv2.GaussianBlur(noisy_image, (3,3), 0)
median_blur = cv2.medianBlur(noisy_image, 3)

bilateral_filter = cv2.bilateralFilter(noisy_image, -1, 75, 75)
이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다