728x90
컴퓨터 비전에서의 연산으로
점 연산, 영역 연산 등이 있었던걸로 기억한다.
스무딩은 아마 영역 연산이었던것 같은데
이전 코드를 조금 수정해서 평균 스무딩을 구현하였다.
먼저 기본 이미지 부터 읽어보고
컬러 이미지를 다룰수 있도록 기존의 Histogram을 조금 수정 후 플로팅 시켰다.
마지막은 커널 사이즈별 블러링 차이
import numpy as np
import matplotlib.pyplot as plt
from utils import Histogram, Threshold
from PIL import Image
img = Image.open("./res/lena.jpg").convert("RGB")
img = np.asarray(img)
plt.imshow(img)
def Histogram(img):
row, col, channels = img.shape
hist = np.zeros((256, channels))
for channel in range(0,channels):
for i in range(0, row):
for j in range(0, col):
hist[img[i, j, channel], channel] += 1
return hist
hist = Histogram(img)
plt.figure(figsize=(12,12))
plt.subplot(3,1,1)
plt.bar(np.arange(0,256), hist[:,0])
plt.subplot(3,1,2)
plt.bar(np.arange(0,256), hist[:,1])
plt.subplot(3,1,3)
plt.bar(np.arange(0,256), hist[:,2])
def meanBlur(img, block_size=5):
if type(img) is not np.ndarray:
raise AssertionError("img is not ndarray")
row, col, channels = img.shape
res = np.zeros((row, col, channels),dtype=int)
if (block_size % 2 == 0):
block_size += 1
for ch in range(0, channels):
for i in range(0, row):
for j in range(0, col):
x_min = j-block_size//2
x_max = j+block_size//2
y_min = i-block_size//2
y_max = i+block_size//2
if x_min <= 0:
x_min = 0
if x_max >= col:
x_max = col
if y_min <= 0:
y_min = 0
if y_max >= row:
y_max = row
val = img[y_min:y_max, x_min:x_max, ch].mean()
res[i, j, ch] = int(val)
return res
res = meanBlur(img, block_size=3)
plt.figure(figsize=(12,12))
plt.subplot(3,1,1)
res = meanBlur(img, block_size=3)
plt.imshow(res)
plt.subplot(3,1,2)
res = meanBlur(img, block_size=5)
plt.imshow(res)
plt.subplot(3,1,3)
res = meanBlur(img, block_size=9)
plt.imshow(res)
300x250
'로봇 > 영상' 카테고리의 다른 글
컴퓨터 비전 알고리즘 구현 - 8. 모폴로지 연산 (0) | 2020.11.30 |
---|---|
컴퓨터 비전 알고리즘 구현 - 7. 가우시안 스무딩 (0) | 2020.11.30 |
컴퓨터 비전 알고리즘 구현 - 5. 오츠 이진화 (0) | 2020.11.27 |
컴퓨터 비전 알고리즘 구현 - 4. 평균 기반 적응적 임계치 이진화 (0) | 2020.11.26 |
컴퓨터 비전 알고리즘 구현 - 3. 단순 이진화 (0) | 2020.11.26 |