블러링
- 블러링은 영상에서 화소값이 급격하게 변하는 부분들을 감소시켜 점진적으로 변하게 함으로써 영상에서 전체적으로 부드러운 느낌이 나게 하는 기술이다. 교재에 따라서 스무딩(smoothing)이라 하기도 한다
import numpy as np, cv2
# 회선 수행 함수 - 행렬 처리 방식(속도 면에서 유리)
def filter(image, mask):
rows, cols = image.shape[:2]
dst = np.zeros((rows, cols), np.float32) # 회선 결과 저장 행렬
xcenter, ycenter = mask.shape[1]//2, mask.shape[0]//2 # 마스크 중심 좌표
for i in range(ycenter, rows - ycenter): # 입력 행렬 반복 순회
for j in range(xcenter, cols - xcenter):
y1, y2 = i - ycenter, i + ycenter + 1 # 관심영역 높이 범위
x1, x2 = j - xcenter, j + xcenter + 1 # 관심영역 너비 범위
roi = image[y1:y2, x1:x2].astype("float32") # 관심영역 형변환
tmp = cv2.multiply(roi, mask) # 회선 적용 - OpenCV 곱셈
dst[i, j] = cv2.sumElems(tmp)[0] # 출력화소 저장
return dst # 자료형 변환하여 반환
# 회선 수행 함수 - 화소 직접 근접
def filter2(image, mask):
rows, cols = image.shape[:2]
dst = np.zeros((rows, cols), np.float32) # 회선 결과 저장 행렬
xcenter, ycenter = mask.shape[1]//2, mask.shape[0]//2 # 마스크 중심 좌표
for i in range(ycenter, rows - ycenter): # 입력 행렬 반복 순회
for j in range(xcenter, cols - xcenter):
sum = 0.0
for u in range(mask.shape[0]): # 마스크 원소 순회
for v in range(mask.shape[1]):
y, x = i + u - ycenter , j + v - xcenter
sum += image[y, x] * mask[u, v] # 회선 수식
dst[i, j] = sum
return dst
image = cv2.imread("img/filter_blur.jpg", cv2.IMREAD_GRAYSCALE) # 영상 읽기
if image is None: raise Exception("영상파일 읽기 오류")
# 블러링 마스크 원소 지정
data = [1/9, 1/9, 1/9,
1/9, 1/9, 1/9,
1/9, 1/9, 1/9]
mask = np.array(data, np.float32).reshape(3, 3)
blur1 = filter(image, mask) # 회선 수행 - 화소 직접 접근
blur2 = filter2(image, mask) # 회선 수행
cv2.imshow("image", image)
cv2.imshow("blur1", blur1.astype("uint8"))
cv2.imshow("blur2", cv2.convertScaleAbs(blur1))
cv2.waitKey(0)
샤프닝
- 블러링이 이웃 화소의 차이를 감소시켜서 부드럽게 만드는 것이라면, 샤프닝은 반대로 입력 화소에서 이웃 화소끼리 차이를 크게 되도록 출력 화소를 만들어서 날카로운 느낌이 나게 만드는 것이다.
import numpy as np, cv2
# 회선 수행 함수 - 행렬 처리 방식
def filter(image, mask):
rows, cols = image.shape[:2]
dst = np.zeros((rows, cols), np.float32) # 회선 결과 저장 행렬
xcenter, ycenter = mask.shape[1]//2, mask.shape[0]//2 # 마스크 중심 좌표
for i in range(ycenter, rows - ycenter): # 입력 행렬 반복 순회
for j in range(xcenter, cols - xcenter):
y1, y2 = i - ycenter, i + ycenter + 1 # 관심영역 높이 범위
x1, x2 = j - xcenter, j + xcenter + 1 # 관심영역 너비 범위
roi = image[y1:y2, x1:x2].astype("float32") # 관심영역 형변환
tmp = cv2.multiply(roi, mask) # 회선 적용 - OpenCV 곱셈
dst[i, j] = cv2.sumElems(tmp)[0] # 출력화소 저장
return dst # 자료형 변환하여 반환
image = cv2.imread("img/filter_sharpen.jpg", cv2.IMREAD_GRAYSCALE) # 영상 읽기
if image is None: raise Exception("영상파일 읽기 오류")
# 샤프닝 마스크 원소 지정
data1 = [0, -1, 0,
-1, 5, -1,
0, -1, 0]
data2 = [[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]]
mask1 = np.array(data1, np.float32).reshape(3, 3)
mask2 = np.array(data2, np.float32)
sharpen1 = filter(image, mask1) # 회선 수행 – 저자 구현 함
sharpen2 = filter(image, mask2)
sharpen1 = cv2.convertScaleAbs(sharpen1)
sharpen2 = cv2.convertScaleAbs(sharpen2)
cv2.imshow("image", image)
cv2.imshow("sharpen1", cv2.convertScaleAbs(sharpen1)) # 윈도우 표시 위한 형변환
cv2.imshow("sharpen2", cv2.convertScaleAbs(sharpen2))
cv2.waitKey(0)
In [ ]:
'Image Processing > OpenCV' 카테고리의 다른 글
[OpenCV] 필터링 (Filtering) (0) | 2022.11.25 |
---|---|
[OpenCV] 에지 검출 (1) | 2022.11.25 |
[OpenCV] 03. 화소처리 (컬러 공간 변환) (0) | 2022.11.23 |
[OpenCV] 02. 화소처리 (히스토그램) (0) | 2022.11.23 |
[OpenCV] 01. 화소 처리 (0) | 2022.11.22 |
댓글