from sklearn.feature_extraction.image import extract_patches_2d from sklearn.feature_extraction.image import reconstruct_from_patches_2d ############################################################################### # Load Lena image and extract patches lena = lena() / 256.0 # downsample for higher speed lena = lena[::2, ::2] + lena[1::2, ::2] + lena[::2, 1::2] + lena[1::2, 1::2] lena /= 4.0 height, width = lena.shape # Distort the right half of the image print('Distorting image...') distorted = lena.copy() distorted[:, height // 2:] += 0.075 * np.random.randn(width, height // 2) # Extract all reference patches from the left half of the image print('Extracting reference patches...') t0 = time() patch_size = (7, 7) data = extract_patches_2d(distorted[:, :height // 2], patch_size) data = data.reshape(data.shape[0], -1) data -= np.mean(data, axis=0) data /= np.std(data, axis=0) print('done in %.2fs.' % (time() - t0)) ############################################################################### # Learn the dictionary from reference patches
############################################################################### # Extract noisy patches and reconstruct them using the dictionary transform_algorithms = [ ('Least-angle regression\n5 atoms', 'lars', {'transform_n_nonzero_coefs': 5}), ('Orthogonal Matching Pursuit\n1 atom', 'omp', {'transform_n_nonzero_coefs': 1}), ('Orthogonal Matching Pursuit\n2 atoms', 'omp', {'transform_n_nonzero_coefs': 2}), ('Thresholding\n alpha=0.1', 'threshold', {'transform_alpha': .1})] reconstructions = {} for title, transform_algorithm, kwargs in transform_algorithms: print(title + '...') reconstructions[title] = lena.copy() t0 = time() dico.set_params(transform_algorithm=transform_algorithm, **kwargs) code = dico.transform(data) highDictionary=dualDictLearn.l2ls_learn_basis_dual(data.T,code.T,1) highDictionary=highDictionary.T print 'Distance: %f'% np.sum(np.abs(V-highDictionary)) pl.figure(figsize=(4.2, 4)) for i, comp in enumerate(highDictionary[:100]): pl.subplot(10, 10, i + 1) pl.imshow(comp.reshape(patch_size), cmap=pl.cm.gray_r,interpolation='nearest') pl.xticks(()) pl.yticks(()) pl.suptitle('Dictionary learned from Lena patches\n' +'Train time %.1fs on %d patches' % (dt, len(data)), fontsize=16) pl.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)
def imageDenoisingTest01(): from time import time import matplotlib.pyplot as plt import numpy as np from scipy.misc import lena from sklearn.decomposition import MiniBatchDictionaryLearning from sklearn.feature_extraction.image import extract_patches_2d from sklearn.feature_extraction.image import reconstruct_from_patches_2d #Load image and extract patches lena = lena() / 256.0 lena = lena[::2, ::2] + lena[1::2, ::2] + lena[::2, 1::2] + lena[1::2, 1::2] lena /= 4.0 height, width = lena.shape #Distort the right half of the image print "distorting image" distorted = lena.copy() distorted[:, height//2:] += 0.075 * np.random.randn(width, height // 2) #plt.imshow(distorted[:, :height//2], cmap = plt.cm.gray, interpolation = "nearest") #plt.show() print "Extacting reference patches" #这里是从distorted的左半边抽取patches t0 = time() patch_size = (7, 7) data = extract_patches_2d(distorted[:, :height//2], patch_size) #data是 30500 * 7 * 7 维矩阵 #print data #print len(data) #print len(data[0][0]) #plt.imshow(data[0], cmap = plt.cm.gray, interpolation = "nearest") #plt.show() #print distorted[:, height//2:].shape #一半是256 * 128 #下面是把patch转换为一维向量, 然后再归一化 data = data.reshape(data.shape[0], -1) data -= np.mean(data, axis = 0) data /= np.std(data, axis = 0) print 'done in ' + str(time() - t0) # Learn the dictionary from reference patches print "Learning the dictionary" t0 = time() #这一步是开始对patches进行学习 #new 一个model dico = MiniBatchDictionaryLearning(n_components = 100, alpha = 1, n_iter = 5000) print data.shape #data是30500 * 49维矩阵 V = dico.fit(data).components_ print V.shape #V是100 * 49维矩阵 dt = time() - t0 print "done in %.2fs." % dt plt.figure(figsize = (4.2, 4)) for i, comp in enumerate(V[:100]): plt.subplot(10, 10, i + 1) plt.imshow(comp.reshape(patch_size), cmap = plt.cm.gray_r, interpolation = "nearest") plt.xticks(()) plt.yticks(()) plt.suptitle("Dictionary learned from lena patches\n" + "Train time %.1fs on %d patches" % (dt, len(data)), fontsize = 16) plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23) def show_with_diff(image, reference, title): plt.figure(figsize = (5, 3.3)) plt.subplot(1, 2, 1) plt.title('Image') plt.imshow(image, vmin = 0, vmax = 1, cmap = plt.cm.gray, interpolation = "nearest") plt.xticks(()) plt.yticks(()) plt.subplot(1,2,2) difference = image - reference plt.title("difference (norm: %.2f)" % np.sqrt(np.sum(difference ** 2))) plt.imshow(difference, vmin = -0.5, vmax = 0.5, cmap = plt.cm.PuOr, interpolation = "nearest") plt.xticks(()) plt.yticks(()) plt.suptitle(title, size = 16) plt.subplots_adjust(0.02, 0.02, 0.98, 0.79, 0.02, 0.02) show_with_diff(distorted, lena, "Distorted Image") #plt.show() #Extract noisy patches and reconstruct them using the dictionary #从右半边抽取patches print('Extracting noisy pathces...') t0 = time() data = extract_patches_2d(distorted[:, height//2:], patch_size) data = data.reshape(data.shape[0], -1) intercept = np.mean(data, axis = 0) data -= intercept print "done in %.2fs. " % (time() - t0) transform_algorithms = [('Orthogonal Matching Pursuit\n1 atom', 'omp', {'transform_n_nonzero_coefs': 1}), ('Orthogonal Matching Pursuit\n2 atoms', 'omp', {'transform_n_nonzero_coefs': 2}), ('Least-angle regression\n5 atoms', 'lars', {'transform_n_nonzero_coefs': 5}), ('Thresholding\n alpha = 0.1', 'threshold', {'transform_alpha': 0.1})] reconstructions = {} for title, transform_algorithm, kwargs in transform_algorithms: print title + "..." reconstructions[title] = lena.copy() t0 = time() dico.set_params(transform_algorithm = transform_algorithm, **kwargs) code = dico.transform(data) #利用之前训练的模型来获得代表系数 -- code patches = np.dot(code, V) if transform_algorithm == "threshold": patches -= patches.min() patches /= patches.max() patches += intercept patches = patches.reshape(len(data), *patch_size) if transform_algorithm == "threshold": patches -= patches.min() patches /= patches.max() reconstructions[title][:, height // 2:] = reconstruct_from_patches_2d(patches, (width, height // 2)) dt = time() - t0 print "done in %.2fs." % dt show_with_diff(reconstructions[title], lena, title + '(time: %.1fs)' % dt) plt.show()
from hdl.interface import SparseCoding ############################################################################### # Load Lena image and extract patches lena = lena() / 256.0 # downsample for higher speed lena = lena[::2, ::2] + lena[1::2, ::2] + lena[::2, 1::2] + lena[1::2, 1::2] lena /= 4.0 height, width = lena.shape # Distort the right half of the image print 'Distorting image...' distorted = lena.copy() distorted[:, height / 2:] += 0.075 * np.random.randn(width, height / 2) # Extract all clean patches from the left half of the image print 'Extracting clean patches...' t0 = time() patch_size = (7, 7) data = extract_patches_2d(distorted[:, :height / 2], patch_size) data = data.reshape(data.shape[0], -1) data -= np.mean(data, axis=0) data /= np.std(data, axis=0) print 'done in %.2fs.' % (time() - t0) ############################################################################### # Learn the dictionary from clean patches (new way)