2016-12-07 3 views
2

sci-kit 이미지에서 mean filter을 사용하고 있습니다. 그러나 부동 소수점 이미지의 dtypeuint8으로 변경되어 다른 필터 함수로 다시 전달할 때 문제가되는 것으로 보입니다.scikit-image : 평균 필터 변경 dtype

그림과 같이 다음 코드를 고려하십시오.

import numpy as np 
from skimage import filters 
from skimage.morphology import square 

def mean_filter(img): 
    selem = square(3) 
    print(img.dtype) 
    print(img.max(), img.min()) 
    fi = filters.rank.mean(img, selem=selem) 
    print(fi.dtype) 
    print(fi.max(), fi.min()) 
    return fi 

arr = np.array([[.1, .2, .3], 
       [.4, .5, .6], 
       [.7, .8, .9]], dtype='float64') 
m = mean_filter(arr) 

다음 출력을 제공합니다.

float64 
0.9 0.1 
uint8 
178 76 

그러나 문서에 따르면 반환 유형은 입력 유형과 같아야합니다. 여기서 무슨 일이 일어나고있는거야?

답변

3

Scikit-image의 rank 필터는 uint8uint16 데이터 유형에 대해서만 정의됩니다. 이것이 결과를 얻는 유형 인 uint8으로 변환하는 이유입니다. 예 :

이미지 : 밝히는 documentation rank.mean, 2-D 어레이 (UINT8, UINT16)

그래서, 입력 uint8 또는 uint16는 skimage는 결과에서 그 데이터 형식을 유지한다면. 그렇지 않으면 이미지를 두포의 이미지로 변환하려고 시도 할 것입니다.

>>> from scipy.ndimage import uniform_filter 
>>> size = 3 
>>> result = uniform_filter(arr, size) 

또는 공상 당신이 경우, 자신의 필터를 만들 :

>>> from scipy.ndimage import convolve1d 
>>> size = 3 
>>> kernel = np.ones(size, arr.dtype)/size 
>>> result = convolve1d(convolve1d(arr, kernel, axis=0), kernel, axis=1) 

참고 : 위의 separable convolution라고 할 수있는 일

대신, scipy를 사용합니다. 이것은 이미지를 두 개의 1 차원 필터로 콘볼 루션함으로써 작동합니다. 먼저 y 축에서 시작하고 x 축에서 시작합니다 (순서는 중요하지 않음). 커널 (필터)이 분리 가능할 때 이미지가 두 번 복잡해지기 때문에 추악 해 보이지만 1 차원 컨볼 루션을 실행하는 것은 단일 2D 컨볼 루션을 실행하는 것보다 훨씬 빠른 속도입니다. Scipy의 uniform_filter은 장면 뒤에서이 작업을 수행합니다. 축 당 한 번만 uniform_filter1d으로 호출됩니다.