Mengapa ndimage.label(image) memberi label pada bentuk tambahan di antara bentuk yang dipertimbangkan?

Saat saya menggunakan paket ndimage.label(img) yang diimpor dari scipy untuk memberi label pada gambar PNG skala abu-abu, perilakunya seperti ini.
Saya memiliki dua gambar dengan beberapa bentuk yang dibuat oleh Photoshop:
Gambar pertama :
http://imageshack.us/a/img140/8669/onehx.png
Saya melakukan kode ini pada gambar di atas.

>>> from scipy.misc import imread
>>> from scipy.ndimage import (label,find_objects)

>>> img=imread('first.jpg')
>>> x,y = label(img)
>>> print y                 # Prints exactly "4" shapes ,which is right.
4

>>> f=find_objects(x)
>>> print f                 # Returns exactly the "4" slices of the considered shapes.
[(slice(16L, 61L, None), slice(149L, 189L, None)),  
(slice(30L, 40L, None), slice(60L, 90L, None)),  
(slice(50L, 70L, None), slice(20L, 120L, None)),  
(slice(96L, 149L, None), slice(130L, 186L, None))]

Sampai saat ini, ini berfungsi dengan baik.
Tapi ketika saya membuat bentuk dengan kuas halus seperti yang ditunjukkan di sini:

Gambar kedua:
http://imageshack.us/a/img822/5696/twozg.png
Saya menjalankan kode ini pada gambar kedua

>>> from scipy.misc import imread
>>> from scipy.ndimage import (label,find_objects)

>>> img=imread('second.jpg')
>>> x,y = label(img)
>>>print y               # Prints more than "5" shapes ,which is wrong.
6

>>> f=find_objects(x)
>>> print f               # Return more than the "5" slices of the considered shapes.
                          #But still has the "5" slices of the "5" considered shapes 
                          #among the other slices which I'm confused of.  
[(slice(16L, 61L, None), slice(149L, 189L, None)),  
(slice(30L, 40L, None), slice(60L, 90L, None)),  
(slice(50L, 70L, None), slice(20L, 120L, None)),  
(slice(96L, 149L, None), slice(130L, 186L, None)),  
(slice(126L, 170L, None), slice(65L, 109L, None)),  
(slice(127L, 128L, None), slice(79L, 80L, None))]    #This is the extra object.

Saya hanya ingin tahu mengapa ndimage.label(img) memberi label lebih dari bentuk yang dipertimbangkan ketika saya menggunakan kuas halus.
Ya, itu bisa memberi label pada bentuk yang dipertimbangkan tetapi mengapa pelabelan tambahan dan bagaimana cara menghilangkan bentuk berlabel tambahan.

Catatan:
(1)Bentuk tambahannya bukan bentuk genap, melainkan daerah hitam tipis.!!
(2)Perilakunya sama jika gambarnya dalam format RGB.
( 3)pola nilai bukan nol pada bentuk yang digambar dengan kuas halus terlihat seperti:

>>> obj_6            #Not quite right but it's similar to this structure
array([[  0,   0,   1,   1,   1,   1,   0,   0],  
       [  0,   1,   6,  12,  15,   9,   3,   0],  
       [  0,   7,  24,  50,  57,  35,  12,   1],  
       [  2,  14,  52, 105, 119,  74,  24,   3],
       [  2,  16,  60, 122, 139,  86,  29,   4],
       [  1,  10,  37,  77,  88,  54,  18,   3],
       [  0,   3,  12,  25,  29,  18,   5,   1],
       [  0,   0,   1,   4,   5,   3,   1,   0]], dtype=uint8)

(4) Untuk mendapatkan gambaran keseluruhan :
satu:
masukkan deskripsi gambar di sinidua:< br> masukkan deskripsi gambar di sini
Terima kasih atas kesabaran Anda.

Pembaruan(1):
Untuk memperjelas, saya memposting dua gambar dan hasil terkait:


person Someone Someoneelse    schedule 05.10.2012    source sumber
comment
Terima kasih telah menambahkan obj_6. Bisakah Anda juga memposting second.jpg di suatu tempat?   -  person Warren Weckesser    schedule 07.10.2012
comment
Maksudnya format jpg yang kedua.png???   -  person Someone Someoneelse    schedule 07.10.2012
comment
Oke, file PNGnya ada di sana--terima kasih. Ketika saya menjalankan label(img) pada file twozg.png menggunakan struktur default (struktur +), saya mendapatkan 6 fitur, karena bentuk kuas memiliki satu piksel yang hanya terhubung ke piksel lainnya melalui satu diagonal. Jika saya menggunakan struktur 3x3 penuh, saya mendapatkan 5 fitur.   -  person Warren Weckesser    schedule 07.10.2012
comment
Meskipun saya sudah mencobanya dengan struktur (3x3) sebelum memposting tetapi mencobanya sekarang saya melihatnya berhasil, jadi Anda benar sekali haha. Terima kasih   -  person Someone Someoneelse    schedule 07.10.2012


Jawaban (2)


Seperti apa pola nilai bukan nol pada bentuk yang digambar dengan kuas halus? Jika ada banyak angka nol di sana, label akan menemukan banyak fitur yang tidak terhubung.

Misalnya, dengan blok piksel 4x4 ini:

In [16]: img
Out[16]: 
array([[ 0. ,  0.5,  0. ,  1. ],
       [ 0. ,  0.5,  0.5,  0. ],
       [ 0.5,  0. ,  1. ,  0. ],
       [ 0.5,  0. ,  1. ,  0. ]])

label(img) menemukan tiga fitur:

In [17]: lbl, n = label(img)

In [18]: lbl
Out[18]: 
array([[0, 1, 0, 2],
       [0, 1, 1, 0],
       [3, 0, 1, 0],
       [3, 0, 1, 0]])

In [19]: n
Out[19]: 3

Saya menduga inilah yang terjadi pada piksel yang digambar dengan kuas halus.

person Warren Weckesser    schedule 06.10.2012
comment
Anda ada benarnya, tapi menurut saya demikian karena dua alasan: (1) Ini memberikan hasil yang sama menggunakan parameter struktur di dalam label...(2) Ini bisa memberi label pada keseluruhan bentuk kuas halus - person Someone Someoneelse; 06.10.2012
comment
Tuan Warren Anda dapat menempatkan struktur ini sebagai parameter untuk memahami maksud saya. s= menghasilkan_struktur_biner(2,2)..labl,n=label(img,s) - person Someone Someoneelse; 06.10.2012
comment
Tentu saja, sebagai contoh saya, struktur 3x3 penuh menghasilkan satu fitur, namun secara umum, hal ini bergantung pada seberapa jarang angka nol dalam bentuk yang digambar dengan kuas halus. Bahkan struktur biner 3x3 penuh dapat menghasilkan banyak fitur jika terdapat cukup angka nol di sana. Perbesar bagian kecil di dekat tepi, dan periksa setiap piksel. Itu akan membantu Anda menentukan apakah piksel bukan nol cukup padat untuk menjamin bahwa bentuk kuas yang halus benar-benar merupakan fitur tunggal. - person Warren Weckesser; 07.10.2012
comment
Tuan Warren Anda mungkin ingin membaca pertanyaan saya lagi ketika saya memposting gambar sebenarnya dengan hasil terkait. - person Someone Someoneelse; 07.10.2012

Untuk menjawab pertanyaan Anda, alasan memberi label pada area tambahan adalah karena Anda menggunakan struktur default dengan konektivitas satu, dan tidak tahu untuk mencari koneksi diagonal.

Selain apa yang ditunjukkan Warren, jika diperlukan pelabelan yang kuat (yang akan memperlakukan piksel diagonal sebagai terhubung), struktur ini dapat diubah. Struktur defaultnya adalah sebagai berikut

In [32]: ndimage.morphology.generate_binary_structure(2, 1).astype("uint8")
Out[32]: 
array([[0, 1, 0],
       [1, 1, 1],
       [0, 1, 0]], dtype=uint8)

Yang memiliki konektivitas 1. Ini diperluas ke gambar dimensi apa pun yang Anda kerjakan.

Jika Anda ingin menggunakan pelabelan tanpa mengkhawatirkan tambahan kecil yang Anda dapatkan secara default, Anda dapat mengubah panggilan ke ndimage.label dengan menambahkan argumen kata kunci "struktur". Struktur (atau kernel) adalah objek biner dengan peringkat yang sama dengan gambar (dimensi), dan dapat dengan mudah diubah. Untuk membuat peringkat penuh

In [41]: struct=np.ones((3,3), dtype="bool8")

In [42]: struct
Out[42]: 
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]], dtype=bool)
In [43]: ndimage.label(img, structure=struct)

Secara teori, ini akan menyelesaikan masalah penambahan objek kecil ke hasil.

person Trevor    schedule 13.12.2012