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?