Разделите изображение на 5×5 блоков в python и вычислите гистограмму для каждого блока

используя Python, я должен разделить (2) Test_Image и Reference_image на блоки 5×5 и вычислить гистограмму для каждого блока и сравнить его с тем же блоком на другом изображении. Для Ex: image1(1,1 ) с изображением2 image2(1,1) . Я должен сравнивать сходство между двумя изображениями (должен быть преобразован инвариант). То, что я сделал до сих пор, – это вычислить гистограмму целого изображения, используя « hist=numpy.histogram(image,bins=256) « Я хочу разделить изображение, а затем вычислить гистограмму для всех этих блоков. Я также хочу использовать коэффициент Бхаттачарья для измерения сходства. Может ли кто-нибудь вести меня с тем, как пройти через это. Заранее спасибо 🙂

2 Solutions collect form web for “Разделите изображение на 5×5 блоков в python и вычислите гистограмму для каждого блока”

Не уверен, что это что-то вроде этого, которое вы ищете. Это версия грубой силы. И это, вероятно, довольно медленно. Но это делает работу. Вы должны решить, что делать с границами. Это не будет включать границу, если окно не будет точно соответствовать

 import numpy as numpy grey_levels = 256 # Generate a test image test_image = numpy.random.randint(0,grey_levels, size=(11,11)) # Define the window size windowsize_r = 5 windowsize_c = 5 # Crop out the window and calculate the histogram for r in range(0,test_image.shape[0] - windowsize_r, windowsize_r): for c in range(0,test_image.shape[1] - windowsize_c, windowsize_c): window = test_image[r:r+windowsize_r,c:c+windowsize_c] hist = numpy.histogram(window,bins=grey_levels) 

Ниже приведен результат, и полное изображение заканчивается. r, c – верхний угол окна

 r=0,c=0 [[ 63 173 131 205 239] [106 37 156 48 81] [ 85 85 119 60 228] [236 79 247 1 206] [ 97 50 117 96 206]] r=0,c=5 [[108 241 155 214 183] [202 2 236 183 225] [214 141 1 185 115] [ 4 234 249 95 67] [232 217 116 211 24]] r=5,c=0 [[179 155 41 47 190] [159 69 211 41 92] [ 64 184 187 104 245] [190 199 71 228 166] [117 56 92 5 186]] r=5,c=5 [[ 68 6 69 63 242] [213 133 139 59 44] [236 69 148 196 215] [ 41 228 198 115 107] [109 236 191 48 53]] [[ 63 173 131 205 239 108 241 155 214 183 42] [106 37 156 48 81 202 2 236 183 225 4] [ 85 85 119 60 228 214 141 1 185 115 80] [236 79 247 1 206 4 234 249 95 67 203] [ 97 50 117 96 206 232 217 116 211 24 242] [179 155 41 47 190 68 6 69 63 242 162] [159 69 211 41 92 213 133 139 59 44 196] [ 64 184 187 104 245 236 69 148 196 215 91] [190 199 71 228 166 41 228 198 115 107 82] [117 56 92 5 186 109 236 191 48 53 65] [177 170 114 163 101 54 80 25 112 35 85]] 

Если ваши изображения большие, вы можете повысить производительность, манипулируя шагами массива, чтобы создать нужные вам окна . Следующее будет использовать функцию обобщенного скользящего окна, найденную в « Эффективном перекрытии Windows с помощью Numpy». В конце я включу ее.

 import numpy as np image1 = np.arange(100).reshape(10,10) image2 = np.arange(100).reshape(10,10) from itertools import izip window_size = (5,5) windows1 = sliding_window(image1, window_size) windows2 = sliding_window(image2, window_size) histograms = [(np.histogram(window1,bins=256),np.histogram(window2,bins=256)) for window1, window2 in izip(windows1, windows2)] for h1, h2 in histograms: print np.all(h1[0] == h2[0]) 

раздвижные оконные функции:

 from numpy.lib.stride_tricks import as_strided as ast from itertools import product def norm_shape(shape): ''' Normalize numpy array shapes so they're always expressed as a tuple, even for one-dimensional shapes. Parameters shape - an int, or a tuple of ints Returns a shape tuple ''' try: i = int(shape) return (i,) except TypeError: # shape was not a number pass try: t = tuple(shape) return t except TypeError: # shape was not iterable pass raise TypeError('shape must be an int, or a tuple of ints') def sliding_window(a,ws,ss = None,flatten = True): ''' Return a sliding window over a in any number of dimensions Parameters: a - an n-dimensional numpy array ws - an int (a is 1D) or tuple (a is 2D or greater) representing the size of each dimension of the window ss - an int (a is 1D) or tuple (a is 2D or greater) representing the amount to slide the window in each dimension. If not specified, it defaults to ws. flatten - if True, all slices are flattened, otherwise, there is an extra dimension for each dimension of the input. Returns an array containing each n-dimensional window from a from http://www.johnvinyard.com/blog/?p=268 ''' if None is ss: # ss was not provided. the windows will not overlap in any direction. ss = ws ws = norm_shape(ws) ss = norm_shape(ss) # convert ws, ss, and a.shape to numpy arrays so that we can do math in every # dimension at once. ws = np.array(ws) ss = np.array(ss) shape = np.array(a.shape) # ensure that ws, ss, and a.shape all have the same number of dimensions ls = [len(shape),len(ws),len(ss)] if 1 != len(set(ls)): raise ValueError(\ 'a.shape, ws and ss must all have the same length. They were %s' % str(ls)) # ensure that ws is smaller than a in every dimension if np.any(ws > shape): raise ValueError('ws cannot be larger than a in any dimension. a.shape was %s and ws was %s' % (str(a.shape),str(ws))) # how many slices will there be in each dimension? newshape = norm_shape(((shape - ws) // ss) + 1) # the shape of the strided array will be the number of slices in each dimension # plus the shape of the window (tuple addition) newshape += norm_shape(ws) # the strides tuple will be the array's strides multiplied by step size, plus # the array's strides (tuple addition) newstrides = norm_shape(np.array(a.strides) * ss) + a.strides strided = ast(a,shape = newshape,strides = newstrides) if not flatten: return strided # Collapse strided so that it has one more dimension than the window. Ie, # the new array is a flat list of slices. meat = len(ws) if ws.shape else 0 firstdim = (np.product(newshape[:-meat]),) if ws.shape else () dim = firstdim + (newshape[-meat:]) # remove any dimensions with size 1 dim = filter(lambda i : i != 1,dim) return strided.reshape(dim) 

Если вы хотите разделить изображение на четыре части, вам нужно вычислить параметры ws и ss . Если оба измерения делятся на два, то ws и ss имеют одно и то же значение ( ss умолчанию ws если не указано). У Numpy есть возможность рассматривать размеры массива как (столбец, строка) или (строка, столбец). Я не изменил никаких значений по умолчанию, а my (строка, столбец). Для изображения 18×26, ws = (26/2, 18/2) – каждое окно будет 13×9, а соседние окна получаются путем выравнивания окна на равную величину, без перекрытия. Если измерение не делится на два, ss также необходимо будет определить, и в окнах будет некоторое перекрытие. Для изображения 18×33:

 >>> >>> rows = 33 >>> columns = 18 >>> divisor = 2 >>> col_size, col_overlap = divmod(columns, divisor) >>> row_size, row_overlap = divmod(rows, divisor) >>> ws = (row_size, col_size) >>> ss = (row_size - row_overlap, col_size - col_overlap) >>> ws, ss ((16, 9), (15, 9)) >>> 

Для 3d-окон (данные из изображений с цветовой гаммой) ws и ss должны иметь три измерения. Изображение 15×15 будет иметь 9 окон 5x5x3

 from PIL import Image import numpy as np img = Image.open('15by15.bmp') a = np.asarray(img) window_size = (5,5,3) windows = sliding_window(a, window_size) print windows.shape >>> (9, 5, 5, 3) for window in windows: print window.shape >>> (5, 5, 3) (5, 5, 3) (5, 5, 3) (5, 5, 3) (5, 5, 3) (5, 5, 3) (5, 5, 3) (5, 5, 3) (5, 5, 3) 
  • оболочка IDLE python, похоже, неправильно обрабатывает некоторые escape-последовательности
  • как я могу запустить IDLE, среду разработки для Python, в Mac OS 10.7?
  • Сценарий IDLE Python не показывает вывод подпроцесса, но cmd.exe делает
  • Код Tkinter с использованием модуля шрифтов не может выполняться из командной строки?
  • Как писать и запускать более одного кода в Python IDLE?
  • Как запустить скрипт Python из командной строки IDLE?
  • Почему я получаю ошибку рекурсии с помощью BeautifulSoup и IDLE?
  • Удаление согласных из строки в Python
  • Python - лучший язык программирования в мире.