0

反復回数が、画像内のピクセルとは異なる隣接ピクセルを持つピクセルの数に依存する、アルゴリズムの最悪のシナリオの推定値を取得したいと思います。M x N画像がグレースケールであると仮定して、同じ値の2つのピクセルが隣接していない範囲のランダムな値で満たされた行列を生成する方法を探してい[0, 255]ます(「コーナー」ネイバーを含む、つまりこれは8の場合です。隣人の場合)。

編集:元の投稿でこれをより明確にする必要があります。範囲内のすべての値の比較的均一なサンプリングを取得しようとしています[0, 255]

どのようにこれを行うでしょうか?ソリューションの効率はそれほど重要ではありません。私は簡単に推論できるものを探しています。

4

4 に答える 4

2
0 1 0 1 0 1 0
2 3 2 3 2 3 2
1 0 1 0 1 0 1

より一般的には、グラフに色を付ける最も簡単な方法は、各頂点に順番に(好きな順序で)アクセスし、隣接する頂点にまだ使用されていない色を付けることです。(この場合のように)隣接する頂点の可能な最大数よりも多くの色がある場合、失うことはできません。

上のグリッドは、各行に沿って左から右にマトリックスにアクセスし、使用可能な最小値を使用した結果です。代わりに、使用可能な値からランダムに1つを選択できます。

import random
rows = [[None] * 10 for i in xrange(10)] # or numpy matrix
for i, row in enumerate(rows):
    for j, _ in enumerate(row):
        available = set(xrange(256))
        if j > 0:
            available.discard(row[j-1])
        if i > 0:
            available.difference_update(rows[i-1][max(0,j-1):j+2])
        row[j] = random.choice(tuple(available))
print '\n'.join(map(str, rows))
于 2012-12-07T03:42:33.387 に答える
0

これを試して:

import numpy as np
np.cumsum(np.cumsum(np.ones((M,N)),axis=0),axis=1) % 255
于 2012-12-07T03:49:22.357 に答える
0
import numpy as np
from random import sample
def foo(M,N):
    #Create an np array of size M X N
    img = np.zeros((M,N))
    #Create a colour set within grayscale
    colours = set(range(255))
    #Iterate through the entire image pixel
    for i in range(M):
        for j in range(N):
            #img[i-1:i+2,j - 1:j + 2].flatten() : neighbouring pixel
            #including the current pixel
            #colours- set(img[i-1:i+2,j - 1:j + 2].flatten() : Colours not in the neighbouring pixel
            #sample(colours- set(img[i-1:i+2,j - 1:j + 2].flatten()),1)[0]: Select one from the above
            #and assign to the current pixel
            img[i,j] = sample(colours- set(img[i-1:i+2,j - 1:j + 2].flatten()),1)[0]
    return img


>>> foo(10,10)
array([[ 153.,  128.,   15.,  163.,  180.,  189.,  186.,  228.,   65.,
         140.],
       [  52.,  229.,  220.,   54.,   79.,  105.,   11.,  146.,   29.,
          70.],
       [ 244.,  119.,  188.,  147.,  230.,  157.,   28.,  243.,  105.,
          62.],
       [ 188.,  135.,  129.,  144.,  192.,   11.,   90.,  193.,   35.,
         149.],
       [  20.,  130.,  140.,  134.,  191.,   63.,   50.,  180.,   49.,
           4.],
       [  88.,  175.,  254.,  151.,  176.,   30.,  122.,  157.,   88.,
          82.],
       [  37.,  190.,   10.,  187.,  221.,   83.,    2.,  115.,  191.,
         148.],
       [  53.,   70.,  150.,  127.,  168.,  141.,  179.,   65.,  253.,
          59.],
       [  96.,    3.,  225.,  218.,   87.,   76.,   41.,  195.,  221.,
         192.],
       [  28.,   35.,  104.,  130.,  207.,   57.,  204.,  228.,   96.,
         174.]])
于 2012-12-07T04:13:14.610 に答える
0

効率は重要ではないとおっしゃっていたので、これを試してみてください。

  from numpy import array
  import random

  available = range(256)
  M=10
  N=5
  def generate():
    return random.choice(available)

  def get_neighbours(i,j):
    neighbours = []
    try:
      neighbours.append(matrix[i][j-1])
      neighbours.append(matrix[i][j+1])
      neighbours.append(matrix[i+1][j])
      neighbours.append(matrix[i-1][j])
      neighbours.append(matrix[i-1][j-1])
      neighbours.append(matrix[i-1][j+1])
      neighbours.append(matrix[i+1][j-1])
      neighbours.append(matrix[i+1][j+1])
    except:
      pass
    return neighbours

  def remove_neighbours(neighbours):
  available = range(256)
    for i in neighbours:
       try: available.remove(i)
       except: pass
    return available

  #First initialize a random matrix without any condition
  matrix = array([[generate() for i in range(M)] for j in range(N)])

  #Apply the condition and modify the matrix
  for i in range(N):
    for j in range(M):
      neighbours = get_neighbours(i,j)
      available = remove_neighbours(neighbours)
      matrix[i][j] = generate() 

  print matrix


 [[215  91   6 110 166 214 189  63  89 107]
  [  5 136  85 200 216  87 105 223 132 112]
  [179 159 116  70   3  44 238  13  41 226]
  [ 48   0  37 248 209 162 211  61  50  40]
  [237 122 135 253 219 196  92 173 163  26]]
于 2012-12-07T09:42:40.110 に答える