有點隨機創建3D圖像給定2個圖像有點隨機創建2個圖像的3D點
目標是從2個圖像中創建一組n個3D座標(種子)。 n可以是100-1000點的任何地方。
我有2個純黑白圖像,它們的高度相同,寬度可變。圖像的大小可以高達1000x1000像素。我將它們讀入numpy數組中,並將rgb代碼壓扁成1(黑色)和零(白色)。
這裏是例如從處理2非常小的圖像:
In [6]: img1
Out[6]:
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)
In [8]: img2
Out[8]:
array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 1, 0, 0, 1, 0, 0],
[0, 0, 1, 1, 0, 0, 0, 1, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 1, 0, 0, 0, 1, 1, 0, 0],
[0, 0, 1, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]], dtype=uint8)
接下來,創建索引陣列黑色像素的所有位置映射爲每個圖像像這樣:
In [10]: np.transpose(np.nonzero(img1))
Out[10]:
array([[0, 0],
[0, 1],
[0, 2],
[0, 3],
[0, 4],
[0, 5],
[0, 6],
...
我然後想要將每個圖像的每個2D黑色像素擴展到3D空間。如果這些3D點相交,我想隨機抓取n個3D字體(種子)。此外,作爲一個增強,如果我可以將這些3d點稍微均勻地分散到三維空間中以避免具有較大黑色像素密度的區域的「聚類」,則會更好。但是我還沒有能夠圍繞這個過程進行考慮。
這裏的設置了一個可視化:
我已經試過以下似乎工作在非常小的圖像,但減速停下的圖像變得更大。瓶頸似乎發生在我分配common_points的地方。
img1_array = process_image("Images/nhx.jpg", nheight)
img2_array = process_image("Images/ku.jpg", nheight)
img1_black = get_black_pixels(img1_array)
img2_black = get_black_pixels(img2_array)
# create all img1 3D points:
img1_3d = []
z1 = len(img2_array[1]) # number of img2 columns
for pixel in img1_black:
for i in range(z1):
img1_3d.append((pixel[0], pixel[1], i)) # (img1_row, img1_col, img2_col)
# create all img2 3D points:
img2_3d = []
z2 = len(img1_array[1]) # number of img1 columns
for pixel in img2_black:
for i in range(z2):
img2_3d.append((pixel[0], pixel[1], i)) # (img2_row, img2_col, img1_col)
# get all common 3D points
common_points = [x for x in img1_3d if x in img2_3d]
# get num_seeds number of random common_points
seed_indices = np.random.choice(len(common_points), num_seeds, replace=False)
seeds = []
for index_num in seed_indices:
seeds.append(common_points[index_num])
問題:
- 我怎樣才能避免瓶頸?我一直未能想出一個numpy解決方案。
- 有沒有更好的解決方案,一般來說,我是如何編碼的?
- 有關我如何能夠在某種程度上均勻分散種子的想法?
更新編輯:
基於盧克的算法,我想出了下面的工作代碼。這是正確的實施?這可以改進嗎?
img1_array = process_image("Images/John.JPG", 500)
img2_array = process_image("Images/Ryan.jpg", 500)
img1_black = get_black_pixels(img1_array)
# img2_black = get_black_pixels(img2_array)
density = 0.00001
seeds = []
for img1_pixel in img1_black:
row = img1_pixel[0]
img2_row = np.array(np.nonzero(img2_array[row])) # array of column numbers where there is a black pixel
if np.any(img2_row):
for img2_col in img2_row[0]:
if np.random.uniform(0, 1) < density:
seeds.append([row, img1_pixel[1], img2_col])
盧克,感謝您的幫助!我沒有做好解釋如何以及爲什麼我想要特定類型的「種子」分佈,但您的算法似乎很好地分配像素。如果它成爲問題,我會在那個時候穿過那座橋。在我接受你的答案之前最後一個問題,我的實現看起來是否正確? – Mox
基本邏輯對我來說很合適。我的猜測是它可以用於小圖像。你可以用一些非常小的東西來測試它,比如一對3x2像素的圖像。 – Luke