def texturekernel(imgs, metric=libpil.onenorm_inverse, cachedfn="texture_kernel.pkl"): if os.path.exists(cachedfn): return numpy.load(cachedfn) n_imgs = len(imgs) # calculation of kernel kernel = numpy.zeros((n_imgs, n_imgs)) for i in xrange(n_imgs): arr1 = libpil.PIL2array(imgs[i]) gray1 = libpil.rgbarr2gray(arr1) for j in xrange(i): arr2 = libpil.PIL2array(imgs[j]) gray2 = libpil.rgbarr2gray(arr2) kernel[i, j] = metric(libpil.laphist(gray1), libpil.laphist(gray2)) kernel = kernel + numpy.transpose(kernel) print kernel return kernel
def main(): image_folder = get_image_folder() imgfiles = glob.glob(os.path.join(image_folder, "*.jpg")) imgs = map(libpil.loadImage, imgfiles) if "color" in sys.argv: color_kernel = colorkernel(imgs, metric=libpil.onenorm_inverse) output_compare_imgs(imgs, color_kernel, outfilename="color.png") color_kernel.dump("color_kernel.pkl") if "texture" in sys.argv: texture_kernel = texturekernel(imgs) output_compare_imgs(imgs, texture_kernel, outfilename="texture.png") texture_kernel.dump("texture_kernel.pkl") if "color" in sys.argv and "texture" in sys.argv: # 1-norm kernel normalization color_kernel /= max(color_kernel.sum(1)) texture_kernel /= max(texture_kernel.sum(1)) for s in xrange(0, 11, 2): r = s * 0.1 kernel = texture_kernel * r + (1 - r) * color_kernel kernel /= kernel.max() output_compare_imgs(imgs, kernel, outfilename="r%.1f.png" % (r,)) for method in ("single", "complete"): output_dendrogram(imgs, kernel, method=method, dend_fn="r%.1f_dendrogram.png" % (r,)) if "scatter" in sys.argv: n_imgs = len(imgs) dominant_colors = numpy.zeros((n_imgs,)) for i in xrange(n_imgs): hue = libpil.rgbarr2hsvarr(libpil.PIL2array(imgs[i]))[0] histhue, edges = libpil.hist(hue, bins=40, rang=(0, 1)) bincenters = 0.5 * (edges[1:] + edges[:-1]) print "dominant hue:", bincenters[histhue.argmax()] dominant_colors[i] = bincenters[histhue.argmax()] total_textures = numpy.zeros((n_imgs,)) for i in xrange(n_imgs): lapimg = libpil.lapacian(libpil.rgbarr2gray(libpil.PIL2array(imgs[i]))) lapimg = lapimg.flatten() meadtext = numpy.median(numpy.abs(lapimg)) print "meandian texture:", meadtext total_textures[i] = meadtext libpil.scatterplot(dominant_colors, total_textures, imgs)