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

+ Recent posts