2016-07-13 5 views
0

image processing(正確には画像のセグメンテーション)でGenetic Algorithms (GA)を使用しています。この場合、individualは、ピクセルのブロック(すなわち、ピクセル座標のセット)を表す。私はピクセルの人を奨励する必要があります。ピクセルブロックがどのくらい連続しているかの尺度

  • individuals持つ隣接する画素(最もフィット)を奨励するためにfitness functionに考慮されるべき個々の必要性の「連続性」を:ピクセルの連続ブロックを奨励するために

    。したがって、進化の間に、座標のセットの連続性(すなわち個体)がこの個体の適応度に影響を与える。

私が直面している問題は、ピクセル座標(x、y)のセットでこの機能(どのくらいcontiguous)を測定するかです。

下の画像を示すことができるように、右側の個体(黒の画素の集合)が左側に明らかより「連続」(したがってフィッタ)個体よりなる:

 

          

+0

例を挙げてみると、これが多く役立ちます。現時点では、あなたが実質的な反応を得るのではないかと疑います。また、プログラミングに関する質問をしていないときには、これを言語でタグ付けしないでください。 – Prune

+0

@Prune私は質問を編集しましたが、もう一度それを開くために追加することをお勧めしますか? – h4k1m

+0

私は、あなたがグループを定義していると感じているものと、それに影響を与えるもの(それはあなたが必要とする言葉だと思います)について、さらに議論を加えることをお勧めします。たとえば、ダイヤモンドの1組の正方形を考えてみましょう... a2、c1、c1、d2の円弧と比較して、チェス/戦艦表記法... a2、b3、b1、c2を使用しましょう。どちらがより連続していますか?どのピクセルがクラスタの中心からどれくらい離れていても、そのクラスタの一部であることができますか?クラスタの連続性はその範囲に影響しますか?競合する3つのクラスタのうち、どのクラスタがそのクラスタ間に1つのピクセルを要求しているか、またはそのクラスタがあるかどうかを決定する「重力」の式は何ですか? – Prune

答えて

1

私はあなたが何を求めているのか理解していると思っています。あなたのピクセルの間に共有される「壁」の数を数えることをお勧めします:

私は、左から右へと連続性が低下していると主張します。

壁の数を数えることは難しいことではありませんが、ここで実装した方法が遅くなる可能性があります。共有壁の

import random 

width = 5 
height = 5 
image = [[0 for x in range(width)] for y in range(height)] 

num_pts_in_individual = 4 

#I realize this may give replicate points 
individual = [[int(random.uniform(0,height)),int(random.uniform(0,width))] for x in range(num_pts_in_individual)] 

#Fill up the image 
for point in individual: 
    image[point[0]][point[1]] = 1 

#Print out the image 
for row in image: 
    print row 


def count_shared_walls(image): 
    num_shared = 0 
    height = len(image) 
    width = len(image[0]) 
    for h in range(height): 
     for w in range(width): 
      if image[h][w] == 1: 
       if h > 0 and image[h-1][w] == 1: 
        num_shared += 1 
       if w > 0 and image[h][w-1] == 1: 
        num_shared += 1 
       if h < height-1 and image[h+1][w] == 1: 
        num_shared += 1 
       if w < width-1 and image[h][w+1] == 1: 
        num_shared += 1 
    return num_shared 

shared_walls = count_shared_walls(image) 
print shared_walls 

異なる画像やカウント:これで

[0, 0, 0, 0, 0] 
[0, 1, 0, 0, 0] 
[0, 0, 0, 0, 0] 
[1, 0, 0, 1, 1] 
[0, 0, 0, 0, 0] 
2 


[1, 0, 0, 0, 0] 
[0, 0, 0, 1, 0] 
[0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0] 
[1, 0, 1, 0, 0] 
0 

[0, 0, 0, 1, 1] 
[0, 0, 0, 1, 0] 
[0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 
4 

一つの大きな問題は、ピクセル位置の変化が発生した場合には、共有の壁の数を変更しないということです、それはしませんスコアに影響します。おそらく、あなたが記述した距離法と共有壁アプローチの組み合わせが最適かもしれません。

+0

共有壁を別の色にすることができますか(最初の画像には4つの壁しか見ることができません)。 – h4k1m

+1

申し訳ありません、私はすべての壁を数えるだけです。それはコード作成が簡単なことです(私が2で与えるすべての数を分けるだけです)。私は、このような壁のカウントは、セミクラスターと密集した個体を区別するのに役立ちますが、物事が遠い場合にはあまり役に立ちません。 – mitoRibo

関連する問題