최근에 RGB 이미지를 양자화하는 알고리즘을 작성했습니다. 모든 픽셀은 (R, G, B) 벡터로 표현되고, 양자화 코드북은 3 차원 벡터로 구성됩니다. 이미지의 모든 픽셀은 유클리드 거리 (더 정확하게는 유클리드 제곱)와 관련하여 가장 가까운 코드북 픽셀에 매핑 (예 : "대체")되어야합니다. 다음과 같이 나는 그것을했다 :가장 가까운 벡터를 찾으십시오
class EuclideanMetric(DistanceMetric):
def __call__(self, x, y):
d = x - y
return sqrt(sum(d * d, -1))
class Quantizer(object):
def __init__(self, codebook, distanceMetric = EuclideanMetric()):
self._codebook = codebook
self._distMetric = distanceMetric
def quantize(self, imageArray):
quantizedRaster = zeros(imageArray.shape)
X = quantizedRaster.shape[0]
Y = quantizedRaster.shape[1]
for i in xrange(0, X):
print i
for j in xrange(0, Y):
dist = self._distMetric(imageArray[i,j], self._codebook)
code = argmin(dist)
quantizedRaster[i,j] = self._codebook[code]
return quantizedRaster
... 그것은 지독 2600 * 2700 픽셀, 내 펜티엄 코어 듀오 2.2 GHz의 거의 8백초, 4 메모리의 연주회 및 이미지를 작동 :(
?다소이 어쩌면 다른 알고리즘 또는 일부 파이썬 고유의 최적화를 최적화 할 수있는 방법이 있나요
UPD :. 나는 이 유클리드 제곱 사용하고 여전히 엄청난 시간을 얻기 위해 노력
,536.
numpy를 사용하고 있습니까? –
전에이 세부 사항을 놓쳤다 : "코드북은 3 차원 벡터의 커플이다"라고 말하면 실제로 2를 의미합니까? 그렇다면 테스트를 위해 항상 2 또는 단지 될 것입니까? – academicRobot
나는 정말로 "3 차원"을 의미했습니다. (LANDSAT 위성 사진을 분석하고 있습니다.) 더 많은 정보가있을 수 있지만 새로운 차원을 추가 할 때 알고리즘의 성능이 선형 적으로 감소함에 따라 3 가지 정보로 테스트해도 괜찮습니다. – m1st