menemukan gambar yang mengandung fragmen yang diberikan

0

Di hard disk lokal saya, saya memiliki direktori dengan ribuan gambar. Saya memiliki gambar kecil (misalnya, 200x100 px). Saya harus menemukan semua gambar yang mengandung fragmen ini. Bagaimana saya bisa melakukan ini? Alat yang disarankan dalam pertanyaan serupa - misalnya dalam pencarian gambar lokal terhadap gambar sumber? - jangan bekerja dalam kasus saya, karena (sejauh yang saya mengerti) mereka mencari seluruh gambar yang sama, sementara saya ingin menemukan gambar yang mengandung fragmen yang diberikan.

pengguna983447
sumber

Jawaban:

1

Karena belum ada jawaban, saya akan memberikan solusi yang mungkin (perhatikan, bahwa ini mahal secara komputasi).

Anda dapat menginstal OpenCV dan mengkompilasi program untuk melakukan tugas seperti itu.

Untuk detail lebih lanjut, bacalah https://stackoverflow.com/a/29669787/8055533

Kode yang relevan di bawah ini:

def find_image(im, tpl):
    im = np.atleast_3d(im)
    tpl = np.atleast_3d(tpl)
    H, W, D = im.shape[:3]
    h, w = tpl.shape[:2]

    # Integral image and template sum per channel
    sat = im.cumsum(1).cumsum(0)
    tplsum = np.array([tpl[:, :, i].sum() for i in range(D)])

    # Calculate lookup table for all the possible windows
    iA, iB, iC, iD = sat[:-h, :-w], sat[:-h, w:], sat[h:, :-w], sat[h:, w:] 
    lookup = iD - iB - iC + iA
    # Possible matches
    possible_match = np.where(np.logical_and(*[lookup[..., i] == tplsum[i] for i in range(D)]))

    # Find exact match
    for y, x in zip(*possible_match):
        if np.all(im[y+1:y+h+1, x+1:x+w+1] == tpl):
            return (y+1, x+1)

    raise Exception("Image not found")

dan

>>> from skimage import data
>>> im = gray2rgb(data.coins())
>>> tpl = im[170:220, 75:130].copy()

>>> fig, ax = plt.subplots()
>>> imshow(im)
>>> rect = Rectangle((x, y), tpl.shape[1], tpl.shape[0], edgecolor='r', facecolor='none')
>>> ax.add_patch(rect)
AvdnhracNTAd9ex
sumber