Hướng dẫn normalized sum of squared differences python - tổng bình phương bình phương được chuẩn hóa python

Trong một nỗ lực để giải quyết câu hỏi về lý do tại sao để bình thường hóa và ngầm định làm thế nào để bình thường hóa:

$ F $ là bản vá tham chiếu của bạn, $ i $ là bản vá đang được kiểm tra.

Vì vậy, hãy tạo $ I $ chỉ bao gồm giá trị tối đa có thể trong định dạng hình ảnh của bạn. Sau đó, $ SSD $ của bạn trở nên rất lớn, mặc dù $ I $ không "tương tự" với $ F $.

Bây giờ, để so sánh, đặt $ i = f $. Về lý thuyết, điều này sẽ cung cấp một lớn [nếu có ý nghĩa gì cả, lớn nhất] $ ssd $ có thể, phải không?

Vì vậy, rõ ràng, công thức $ SSD $ của bạn cũng không hữu ích cho việc so sánh mọi thứ, bởi vì một $ i $ với biên độ trung bình cao sẽ luôn xuất hiện như một "người chiến thắng", luôn luôn. Vì vậy, bạn cần có được năng lượng của $ I $ ra khỏi công thức của bạn trước. Điều đó thật dễ dàng: Chỉ cần chia $ I $ cho tổng các bình phương của tất cả các giá trị của nó.

Hãy thực hiện phù hợp với mẫu để tìm Waldo.

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

Nhập khẩu numpy as np
defcalculation_ssd [IMG1, IMG2]: calculate_ssd[img1, img2]:
"" "Tính toán tổng của sự khác biệt bình phương [SSD] giữa hai hình ảnh." ""
ifimg1.Shape! = img2.Shape: img1.shape != img2.shape:
in ["Hình ảnh không có hình dạng giống nhau."]["Images don't have the same shape."]
return
returnnp.sum [[np.array [img1, dtype = np.float32] -np.array [img2, dtype = np.float32]] ** 2] np.sum[[np.array[img1, dtype=np.float32] - np.array[img2, dtype=np.float32]]**2]

Những ý kiến ​​khác¶

  • Mẫu phù hợp với xoay vòng bất biến? Thế còn các vết tắc? Những gì về sự thay đổi trong màu sắc?
  • Kế hoạch bài học
  • Cross-correlation
  • Tổng của sự khác biệt bình phương
  • Tổng số khác biệt bình phương
  • Tương quan chéo chuẩn hóa

Hệ số tương quan

Hệ số tương quan chuẩn hóa

Waldo ở đâu? ¶

Nhiệm vụ của chúng tôi là tìm Waldo

trong đám đông patches in the image with Waldo's picture. In order to do so, we need to be able determine if patch 1 is more similar to patch 2 or patch 3 [as shown in the figure below].

Cái nhìn sâu sắc chính

So sánh các bản vá trong hình ảnh với hình ảnh của Waldo. Để làm như vậy, chúng ta cần có thể xác định xem bản vá 1 có giống với bản vá 2 hay bản vá 3 hơn không [như thể hiện trong hình bên dưới].

Mẫu phù hợp

Cho một hình ảnh nguồn $ i $ và một mẫu $ t $, chúng tôi so sánh hình ảnh mẫu với hình ảnh nguồn bằng cách trượt nó một pixel tại một thời điểm [từ trái sang phải, từ trên xuống dưới] và tính toán một sự tương đồng [hoặc khác biệt thay thế] giữa Mẫu và bản vá hình ảnh tại mỗi vị trí. Điểm số tương tự được tính toán bằng hàm phù hợp $ g [t, i, i, j] \ mapsto r [i, j] $, trong đó $ r [i, j] $ là điểm tương tự cho giữa mẫu và hình ảnh Bản vá tại vị trí $ [i, j] $. Vị trí tương ứng với giá trị cao nhất [hoặc thấp nhất thay thế] trong ma trận kết quả $ r $ đại diện cho "vị trí khớp".

In [1]:

import cv2
import numpy as np
import scipy as sp
from scipy import signal
import matplotlib.pyplot as plt

In [2]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]

Out[2]:

Một mẹo phổ biến là coi cả mẫu và bản vá là vectơ trong một không gian chiều cao. Vấn đề phù hợp với khuôn mẫu sau đó được giảm xuống để tìm vectơ gần nhất [trong không gian chiều cao này].

In [3]:

Chọn các bản vá hình ảnh

In [4]:

template = cv.imread['data/waldo.png']
template = cv.cvtColor[template, cv.COLOR_BGR2RGB]
plt.figure[figsize=[5,5]]
plt.imshow[template]

Out[4]:

In [5]:

template = template.flatten[]
patch = pick_patch[I, 300, 400, 15, 15].flatten[]
print['Template size = {}'.format[template.shape[0]]]
print['Patch size = {}'.format[patch.shape[0]]]

Template size = 21939
Patch size = 2883

Hãy chọn một bản vá từ hình ảnh này

y, x = 250, 750
half_h, half_w = 100, 200

def pick_patch[I, y, x, half_h, half_w]:
    return I[y-half_h:y+half_h+1, x-half_w:x+half_w+1, :]

for yi in range[3]:
    for xi in range[1]:
        x_ = x + 30 * xi
        y_ = y + 30 * yi
        patch = pick_patch[I, y_, x_, half_h, half_w]
        fig = plt.figure[figsize=[5,5]]
        plt.imshow[patch]
        plt.title['Patch: yx = {}, size = {}'.format[[y_,x_], patch.shape[:2]]]
        plt.show[]
: The template and the patch must have the same dimensions.

Đây là vấn đề. Làm thế nào để chúng ta so sánh hai vectơ có kích thước khác nhau?

Quan sát 1: Mẫu và bản vá phải có cùng kích thước.

  • Kỹ thuật so sánh các bản vá lỗi
  • Bây giờ chúng tôi thảo luận về các phương pháp để so sánh các bản vá hình ảnh [và mẫu]. Các cuộc thảo luận sau đây giả định rằng các bản vá [và mẫu] có cùng kích thước [quan sát 1 ở trên]. Chúng tôi cũng sử dụng ký hiệu sau:
  • Mẫu: $ T $
  • Hình ảnh: $ i $

Aside:

Bản vá hình ảnh tập trung ở $ [i, j] $: $ i [i+k, j+l] $

In [6]:

def highlight[R, T, I, use_max=True]:
    W, H = I.shape[0], I.shape[1]
    w, h = T.shape[0], T.shape[1]
    wr, hg = R.shape[0], R.shape[1]
#     print[W,H]
#     print[w,h]
#     print[wr,hg]
        
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc[R]
    loc = max_loc if use_max else min_loc
    loc = loc + np.array[[h//2, w//2]]               # Size of R is different from I 
    tl = loc - np.array[[h//2, w//2]]
    br = loc + np.array[[h//2, w//2]]
    I_ = np.copy[I]
    c = [1.0, 0, 0] if I_.dtype == 'float32' else [255, 0, 0]
#     print[c]
#     print[tl]
#     print[br]
    cv.rectangle[I_, tuple[tl], tuple[br], c, 4]
    return I_

# Image
img_waldo = cv.imread['data/where-is-waldo.jpg']
img_waldo = cv.cvtColor[img_waldo, cv.COLOR_BGR2RGB]
img_waldo_zoomed = img_waldo[344:824, 1100:1440, :]
img = cv.cvtColor[img_waldo_zoomed, cv.COLOR_RGB2GRAY]
# plt.figure[figsize=[20,20]]
# plt.imshow[img_waldo_zoomed]
# plt.xticks[[]]
# plt.yticks[[]]

# Template
waldo = img_waldo_zoomed[167:264,123:179,:]
template = cv.cvtColor[waldo, cv.COLOR_RGB2GRAY]
foo = np.ones[img_waldo_zoomed.shape, dtype=img_waldo_zoomed.dtype]*255
foo[0:waldo.shape[0],0:waldo.shape[1],:] = waldo

plt.figure[figsize=[15,5]]
plt.subplot[131]
plt.title['Image']
plt.imshow[img_waldo_zoomed]
plt.subplot[132]
plt.title['Template']
plt.imshow[waldo]
plt.subplot[133]
plt.title['Template [Actual Size]']
plt.imshow[foo]
plt.suptitle['Image and template used for the following examples'];

Trả lời: $ r $

Đối với chức năng khớp mẫu openCV nếu hình ảnh là $ w \ lần h $ và mẫu là $ w \ lần h $ thì kết quả $ r $ là $ [w-w+1] \ lần [h-h+1] $.

Tổng của sự khác biệt bình phương [SSD] ¶

$$ r [i, j] = \ sum_ {k, l} \ trái [i [i+k, j+l] - t [k, l] \ right]^2 $$

In [7]:

T = template.copy[]
I = img.copy[]

method = 'cv2.TM_SQDIFF'
R = cv.matchTemplate[I, T, eval[method]]
I_ = highlight[R, T, img_waldo_zoomed, use_max=False]

plt.figure[figsize=[10,6]]
plt.subplot[121]
plt.title['Response $R[i,j]$']
plt.imshow[R, cmap = 'gray']
plt.subplot[122]
plt.imshow[I_]
plt.suptitle[method]
plt.show[];

Ở đây $ r [i, j] $ mã hóa khoảng cách giữa mẫu và bản vá hình ảnh tập trung tại vị trí hình ảnh $ [i, j] $. Giá trị này càng nhỏ, càng giống nhau là mẫu với bản vá.

SSD nhạy cảm với cường độ trung bình.

Tổng của sự khác biệt bình phương được chuẩn hóa [SSD] ¶

In [8]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
0

Định nghĩa hệ số tương quan

Thước đo mức độ mà chuyển động của hai biến ngẫu nhiên được liên kết

$$ \ rho_ {xy} = \ frac {\ mathrm {cov} [x, y]} {\ sigma_x \ sigma_y} $$

ở đâu

$ ans , $ \ mu_y $, $ \ sigma_x $ và $ \ sigma_y $ lần lượt là phương tiện và độ lệch chuẩn của chúng.

Hệ số tương quan¶

$$ r [i, j] = \ sum_ {k, l} i '[i+k, j+l] t' [k, l] $$

ở đâu

$ ans , $ \ mu_y $, $ \ sigma_x $ và $ \ sigma_y $ lần lượt là phương tiện và độ lệch chuẩn của chúng.

Hệ số tương quan¶

In [9]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
1

$$ r [i, j] = \ sum_ {k, l} i '[i+k, j+l] t' [k, l] $$

$$ \ start \ frac {1} {wh} \ sum_ {k ', l'} t [k ', l'] \ end {align} $$

ở đâu

$ ans , $ \ mu_y $, $ \ sigma_x $ và $ \ sigma_y $ lần lượt là phương tiện và độ lệch chuẩn của chúng.

Hệ số tương quan¶

$$ r [i, j] = \ sum_ {k, l} i '[i+k, j+l] t' [k, l] $$

In [10]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
2

$$ \ start \ frac {1} {wh} \ sum_ {k ', l'} t [k ', l'] \ end {align} $$

$ W $ và $ H $ Tham khảo chiều rộng và chiều cao của mẫu $ T $.

Hệ số tương quan được chuẩn hóa Or

In [11]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
3

$$ r [i, j] = \ frac {\ sum_ {k, l} i '[i+k, j+l] t' [k, l]} {\ sqrt {\ sum_ {k, l} i '[i+k, j+l]^2 \ sum_ {k, l} t' [k, l]^2}} $$

Bất biến có nghĩa là và quy mô của cường độ.

In [12]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
4

Liên quan chéo liên quan

$$ r [i, j] = \ sum_ {k, l} i [i+k, j+l] t [k, l] $$

In [13]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
5

Out[13]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
6

Phản ứng mạnh hơn cho cường độ cao hơn, dẫn đến dương tính giả. Hãy nhớ lại rằng mối tương quan chéo có thể được thực hiện dưới dạng lọc tuyến tính.

In [14]:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

I = cv.imread['data/where-is-waldo.jpg']
I = cv.cvtColor[I, cv.COLOR_BGR2RGB]
plt.figure[figsize=[10,10]]
plt.imshow[I]
7

Tương quan chéo được chuẩn hóa: Template matching is not scale invariant.

$$ r [i, j] = \ frac {\ sum_ {k, l} i [i+k, j+l] t [k, l]} {\ sqrt {\ sum_ {k, l} i [i +k, j+l]^2 \ sum_ {k, l} t [k, l]^2}} $$

Cân nhắc quy mô

Cho đến nay, chúng tôi đã giả định rằng mẫu có cùng kích thước [nghĩa là tỷ lệ tương tự] là đối tượng đích trong hình ảnh. Lưu ý rằng mẫu "Waldo" có cùng kích thước [nghĩa là chiều cao và chiều rộng] như kích thước của "Waldo" được thấy trong hình ảnh. Điều gì sẽ xảy ra nếu chúng ta thư giãn giả định này?

Bài Viết Liên Quan

Chủ Đề