OpenCV-Python 이미지 부 드 러 운 처리 작업 실현

그림 부 드 러 운 처리 가 무엇 입 니까?
이미지 의 원래 정 보 를 최대한 보존 하 는 상황 에서 이미지 내부 의 소음 을 걸 러 냅 니 다.이 과정 을 우 리 는 이미지 의 부 드 러 운 처리 라 고 부 르 고 얻 은 이미 지 를 부 드 러 운 이미지 라 고 부 릅 니 다.
그렇다면 무엇이 이미지 의 소음 입 니까?
이미지 의 소음 은 이미지 에서 주변 픽 셀 과 차이 가 비교적 큰 픽 셀 점 이다.소음 처 리 는 픽 셀 점 에 가 까 운 근사치 로 바 꾸 어 그림 을 더욱 부 드 럽 게 하 는 것 이다.
그림 을 부 드 럽 게 처리 하 는 소음 수치 추출 방식 은 다음 과 같은 6 가지 가 있다.
(1)평균 값 필터
(2)사각형 필터
(3)고 스 필터
(4)중간 값 필터
(5)쌍무 필터
(6)2D 볼 륨(사용자 정의 필터)
평균 값 필터
평균 값 필 터 는 현재 픽 셀 점 주위 N*N 개의 픽 셀 점 의 평균 값 으로 현재 픽 셀 값 을 대체 하 는 것 을 말 합 니 다.이 방법 을 사용 하여 그림 속 의 모든 픽 셀 점 을 옮 겨 다 니 면 전체 그림 의 평균 값 필 터 를 완성 할 수 있 습 니 다.
평균 값 필터 처 리 를 할 때,우 리 는 주위 의 몇 개의 픽 셀 점 을 평균 값 으로 하 는 지 고려 해 야 한다.일반적인 상황 에서 우 리 는 현재 픽 셀 점 을 중심 으로 줄 수 와 열 수가 같은 구역 안의 모든 픽 셀 점 을 평균 값 으로 합 니 다.
그러나 가장자리 픽 셀 점 은 이렇게 할 수 없습니다.예 를 들 어 왼쪽 상단 의 픽 셀 점 은 왼쪽 상단 픽 셀 점 이 없 기 때문에 이 럴 때 우 리 는 이미지 에 존재 하 는 주변 인접 점 의 평균 값 을 자주 찾 습 니 다.
OpenCV 에서 우리 에 게 제공 하 는 평균 값 필터 함 수 는 cv2.blur()이 고 전체 정 의 는 다음 과 같 습 니 다.

def blur(src, ksize, dst=None, anchor=None, borderType=None): 
src:원본 이미지
kszie:필터 센터 의 크기,즉 평균 값 의 주위 픽 셀 점 의 높이 와 너비,예 를 들 어(5,5)는 5*5 인접 픽 셀 점 의 평균 값 을 결과 로 하 는 것 입 니 다.
anchor:닻 점,기본 값(-1,1)은 현재 평균 값 을 계산 하 는 점 이 핵 중심 점 에 있 음 을 나타 낸다.보통 기본 값 을 사용 하면 됩 니 다.
borderType:경계 스타일 입 니 다.이 값 은 경 계 를 어떤 방식 으로 처리 할 지 결정 합 니 다.일반적인 상황 에서 변경 할 필요 가 없습니다.
이 함수 의 정 의 를 알 게 되 었 습 니 다.다음은 소음 제거 이미 지 를 간단하게 완성 하 겠 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("5.jpg")
result_5img = cv2.blur(img, (5, 5))
result_30img= cv2.blur(img, (30, 30))
cv2.imshow("img", img)
cv2.imshow("result_5img", result_5img)
cv2.imshow("result_30img", result_30img)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
530
위의 그림 에서 알 수 있 듯 이(5,5)볼 륨 을 사용 하여 평균 값 여과 처 리 를 한 후 그림 은 모호 하지만 식별 할 수 있다.반면(30,30)볼 륨 을 사용 하여 평균 값 필 터 를 하면 이미지 일 그 러 짐 이 심각 하 다.
그래서 우 리 는 볼 륨 핵 이 클 수록 소음 제거 효과 가 좋 고 시간 이 오래 걸 릴 수록 이미지 일 그 러 짐 도 심각 하 다 는 것 을 알 수 있다.실제 처리 에서 우 리 는 일 그 러 짐 과 소음 제거 사이 에서 균형 을 잡 고 적당 한 볼 륨 크기 를 선택해 야 한다.
스 퀘 어 필터
사각형 필터 와 평균 값 필터 의 차이 점 은 사각형 필 터 는 픽 셀 의 평균 값 을 계산 하지 않 습 니 다.평균 값 필터 의 결 과 를 획일 화 할 지 여 부 를 자 유 롭 게 선택 할 수 있 습 니 다.즉,필터 결과 가 이웃 픽 셀 값 의 합 인지,이웃 픽 셀 값 의 합 인지 자 유 롭 게 선택 할 수 있 습 니 다.
OpenCV 에서 cv2.boxFilter()함 수 를 제공 하여 사각형 필 터 를 실현 합 니 다.전체 정 의 는 다음 과 같 습 니 다.

def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None): 
src:원본 이미지
ddepth:처리 결과 이미지 의 깊이,일반적으로-1 을 사용 하여 원 이미지 와 같은 이미지 깊이 를 표시 합 니 다.
ksize:필터 핵심 크기
normalize:필터 시 정규 화 처 리 를 할 지 여부 입 니 다.이것 이 1 일 때 귀 일화 처 리 를 해 야 한 다 는 뜻 이다.즉,이웃 픽 셀 값 과 나 누 기 면적 이다.예 를 들 어(3,3)공식 은 다음 과 같다.
公式
0 일 때 귀 일 화 된 처 리 를 하지 않 고 이웃 픽 셀 값 의 합 을 직접 사용 하 는 것 을 나타 낸다.
다음 에 우 리 는 프로그램 으로 각각 귀 일화 와 불 귀 일화 효 과 를 실현 할 것 이다.코드 는 다음 과 같다.

import cv2

img = cv2.imread("5.jpg")
result1 = cv2.boxFilter(img, -1, (5, 5))
result2 = cv2.boxFilter(img, -1, (30, 30))
result3 = cv2.boxFilter(img, -1, (2, 2),normalize=0)
cv2.imshow("img", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 표시 되 는 효 과 는 다음 과 같 습 니 다.
效果
왼쪽 아래 는 획일 화 처리 가 필요 하지 않 습 니 다.여 기 는(2,2)만 취하 고 큰 것 을 취하 면 해 보 세 요.범위 가 넓 고 보통 255 보다 크 면 그림 이 모두 흰색 이 될 수 있 기 때문이다.
가우스 필터
평균 값 필터 와 사각형 필 터 를 할 때 이웃 지역 의 모든 픽 셀 의 가중치 가 같 습 니 다.한편,고 스 필 터 는 중심 점 의 가중치 를 증가 시 키 고 중심 점 에서 멀리 떨 어 진 가중치 를 줄 여 이웃 지역 내 각 픽 셀 값 의 가중치 와 합 을 계산한다.
OpenCV 에서 이것 은 우리 에 게 cv2.GaussianBlur()함 수 를 제공 하여 고 스 필 터 를 하 는데 그 완전한 정 의 는 다음 과 같다.

def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None):
src:원본 이미지
ksize:필터 핵 크기
sigmaX:볼 륨 과 수평 방향(X 축 방향)의 표준 차 이 는 가중치 비례 를 제어 합 니 다.
sigmay:볼 륨 과 수직 방향(Y 축 방향)의 표준 차이 도 가중치 비례 를 제어 합 니 다.만약 그것 이 0 이 라면 sigmax 의 값 만 사용 합 니 다.sigmax 와 sigmay 가 모두 0 이 라면 ksize.width 와 ksize.height 를 통 해 계산 할 수 있 습 니 다(선택 가능 한 매개 변수)
다음은 고 스 필 터 를 사용 하여 효 과 를 보 겠 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("5.jpg")
result = cv2.GaussianBlur(img, (3, 3), 0, 0)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
高斯滤波
중간 값 필터
중간 값 필 터 는 앞의 세 가지 필터 와 다 릅 니 다.필터 결 과 를 가중 평균 값 으로 계산 하지 않 고 이웃 지역 의 모든 픽 셀 값 의 중간 값 으로 현재 픽 셀 점 의 픽 셀 값 을 대체 합 니 다.
쉽게 말 하면 현재 픽 셀 점 과 주변 에 있 는 픽 셀 값 을 가 져 와 정렬 한 후 중간 위치 에 있 는 픽 셀 값 을 현재 위치 에 있 는 픽 셀 값 으로 하 는 것 입 니 다.
OpenCV 에서 cv2.medianBlur()함수 에 중간 값 필 터 를 제공 합 니 다.전체 정 의 는 다음 과 같 습 니 다.

def medianBlur(src, ksize, dst=None): 
src:원본 이미지
kszie:필터 핵 크기
매개 변 수 는 두 개 입 니 다.다음은 코드 로 테스트 해 보 겠 습 니 다.

import cv2

img = cv2.imread("5.jpg")
result = cv2.medianBlur(img, 3)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 표시 효 과 는 다음 과 같 습 니 다.
中值滤波
여기 서 우 리 는 얼굴의 붉 은 점 을 없 애 는 것 을 볼 수 있다.특히 주의해 야 할 것 은 필터 핵 의 크기 는 반드시 홀수 여야 하 며,행렬 중심 점 이 밖으로 파생 되 는 것 은 반드시 홀수 이 며,믿 지 않 으 면 마음대로 행렬 에서 점 을 찾 아 시험 해 볼 수 있다 는 것 이다.
쌍무 필터
쌍무 필 터 는 공간 정보 와 색채 정 보 를 종합 적 으로 고려 한 필터 방식 으로 필터 과정 에서 이미지 안의 가장자리 정 보 를 효과적으로 보호 할 수 있다.
앞의 필터 방식 은 기본적으로 공간의 가중치 정보 만 고려 했 는데 이런 상황 은 계산 하기에 비교적 편리 하지만 변두리 정보의 처리 에 있어 비교적 큰 문제 가 존재 한다.한편,쌍무 필터 가 가장 자 리 를 처리 할 때 현재 점 색채 와 비슷 한 픽 셀 점 은 비교적 큰 가중치 를 주 고 현재 픽 셀 점 색채 와 차이 가 큰 것 은 비교적 작은 가중치 를 주어 가장자리 정 보 를 보호 한다.
간단하게 요약 하면 쌍무 필 터 는 특정한 픽 셀 점 의 새로운 값 을 계산 할 때 거리 정 보 를 고려 할 뿐만 아니 라 색채 정보 도 고려한다.쌍무 필 터 는 소음 을 효과적으로 제거 할 수 있 고 가장자리 정 보 를 잘 보호 할 수 있다.
OpenCV 에서 이것 은 우리 에 게 cv2.bilateralFilter()함 수 를 제공 하여 실현 합 니 다.그 완전한 정 의 는 다음 과 같 습 니 다.

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None):
src:원본 이미지
d:필터 에서 선택 한 공간 거리 매개 변 수 는 현재 픽 셀 점 을 중심 으로 하 는 지름 을 표시 합 니 다.이 값 이 비정 수 라면 매개 변수 sigmaSpace 에서 계산 할 수 있 습 니 다.만약 필터 공간 이 비교적 크다 면,예 를 들 어 d>5 는 속도 가 비교적 느리다.따라서 실제 응용 에서 d=5 를 추천 합 니 다.소음 이 비교적 큰 오프라인 필터 에 대해 서 는 d=9 를 선택 할 수 있다.
sigmacolor:필터 처리 시 선택 한 색상 범위 입 니 다.이 값 은 주위 의 어떤 픽 셀 점 이 필터 에 참여 할 수 있 는 지 결정 합 니 다.현재 픽 셀 점 과 의 픽 셀 값 차 이 는 sigma Color 의 픽 셀 점 보다 작 으 며 현재 필터 에 참여 할 수 있 습 니 다.이 값 이 클 수록 주변 에 더 많은 픽 셀 점 이 연산 에 참여 할 수 있다 는 것 을 의미한다.이 값 이 0 일 때 필터 가 의 미 를 잃 습 니 다.이 값 은 255 로 지정 한 지름 내의 모든 점 이 연산 에 참여 할 수 있 습 니 다.
sigma Space:좌표 공간의 sigma 값.그것 의 값 이 클 수록 필터 계산 에 참여 할 수 있 는 점 이 많다 는 것 을 의미한다.d>0 시 sigma Space 의 값 이 어떻든 간 에 d 는 인접 지역 의 크기 를 지정 합 니 다.그렇지 않 으 면 d 역 sigma Space 의 값 이 비례 합 니 다.
간단하게 보기 위해 블 로 거들 은 두 개의 sigma Color 와 sigma Space 값 을 같은 것 으로 설정 했다.만약 그것들의 값 이 비교적 작다 면,예 를 들 어 10 보다 작 으 면 필터 의 효과 가 뚜렷 하지 않다.만약 그것들의 값 이 비교적 크다 면,예 를 들 어 150 보다 크 면 필터 효과 가 비교적 뚜렷 할 것 이다.
코드 는 다음 과 같다.

import cv2

img = cv2.imread("5.jpg")
result = cv2.bilateralFilter(img,25,50,50)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 표시 효 과 는 다음 과 같 습 니 다.
双边滤波
2D 볼 륨
OpenCV 에 서 는 위 에서 자주 사용 하 는 필터 방식 을 제공 하 는 것 외 에 도 볼 륨 핵 을 사용자 정의 하여 볼 륨 작업 을 할 수 있 습 니 다.이 함 수 는 cv2.Filter2D()입 니 다.전체 정 의 는 다음 과 같 습 니 다.

def filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None): 
src:원본 이미지
ddepth:처리 결과 이미지 의 깊이,-1 원본 이미지 와 일치 합 니 다.
kernel:볼 륨 핵 은 단일 채널 배열 입 니 다.컬러 이미 지 를 처리 할 때 채널 마다 다른 핵 을 사용 하려 면 컬러 이미 지 를 분해 한 후 서로 다른 핵 을 사용 해 야 합 니 다.
dela:수정 값,선택 가능 한 인자.이 값 이 존재 한다 면,기본 필터 결과 에 이 값 을 더 해 최종 필터 결과 로 한다.
다음은 이 함 수 를 사용 하여 효 과 를 보 겠 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("5.jpg")
kernel = np.ones((9,9), np.float32) / 81
result = cv2.filter2D(img, -1, kernel)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
2D卷积
여기 서 OpenCV-Python 이 이미지 부 드 러 운 처리 작업 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 OpenCV 이미지 부 드 러 운 처리 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기