Để so sánh hai hình ảnh, chúng tôi sử dụng Lỗi bình phương trung bình [MSE] của các giá trị pixel của hai hình ảnh. Các hình ảnh tương tự sẽ có ít giá trị lỗi bình phương hơn. Sử dụng phương pháp này, chúng ta có thể so sánh hai hình ảnh có cùng chiều cao, chiều rộng và số lượng kênh
bước
Bạn có thể sử dụng các bước sau để so sánh hai hình ảnh bằng OpenCV −
Nhập thư viện cần thiết. Trong tất cả các ví dụ Python sau, thư viện Python bắt buộc là OpenCV. Hãy chắc chắn rằng bạn đã cài đặt nó
import cv2
Đọc hình ảnh đầu vào bằng cv2. imread[] và chuyển đổi nó thành thang độ xám. Chiều cao, chiều rộng và số kênh của các hình ảnh phải giống nhau
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]
Xác định một hàm để tính toán Lỗi bình phương trung bình giữa hai hình ảnh
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse
Tính toán Lỗi bình phương trung bình [Lỗi khớp] giữa các hình ảnh
error = mse[img1, img2]
In lỗi khớp hình ảnh [mse] và hiển thị sự khác biệt hình ảnh
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]
In giá trị kết quả, số liệu khớp hình ảnh. Giá trị càng thấp thì càng phù hợp
print["Matching Image 1 with Image 2:", ret12]
Hãy xem xét một số ví dụ để hiểu rõ hơn
Chúng tôi sẽ sử dụng các hình ảnh sau đây làm Tệp đầu vào trong các ví dụ bên dưới
ví dụ 1
Trong ví dụ này, chúng tôi tạo một Mạng nơ-ron nhân tạo đơn giản với bốn lớp không có chức năng chuyển tiếp
đầu ra
Khi thực thi, nó sẽ tạo ra đầu ra sau trên bàn điều khiển -
Image matching Error between the two images: 3.0696934396076028
Và chúng tôi nhận được cửa sổ sau hiển thị sự khác biệt giữa hai hình ảnh -
ví dụ 2
Trong chương trình Python này, chúng tôi so sánh ba hình ảnh
import cv2 import numpy as np import matplotlib.pyplot as plt img1 = cv2.imread['panda.jpg'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] h, w = img1.shape img2 = cv2.imread['panda1.jpg'] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY] img3 = cv2.imread['bike.jpg'] img3 = cv2.cvtColor[img3, cv2.COLOR_BGR2GRAY] def error[img1, img2]: diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] msre = np.sqrt[mse] return mse, diff match_error12, diff12 = error[img1, img2] match_error13, diff13 = error[img1, img3] match_error23, diff23 = error[img2, img3] print["Image matching Error between image 1 and image 2:",match_error12] print["Image matching Error between image 1 and image 3:",match_error13] print["Image matching Error between image 2 and image 3:",match_error23] plt.subplot[221], plt.imshow[diff12,'gray'],plt.title["image1 - Image2"],plt.axis['off'] plt.subplot[222], plt.imshow[diff13,'gray'],plt.title["image1 - Image3"],plt.axis['off'] plt.subplot[223], plt.imshow[diff23,'gray'],plt.title["image2 - Image3"],plt.axis['off'] plt.show[]
đầu ra
Khi thực thi, chương trình Python ở trên sẽ tạo đầu ra sau trên bàn điều khiển -
________số 8Và chúng tôi nhận được cửa sổ sau, hiển thị sự khác biệt giữa các hình ảnh -
Lưu ý rằng lỗi Matching giữa Image1 và Image2 ít hơn so với lỗi Matching giữa Image 1 & 3 và giữa Image 2 & 3. Vì vậy, Hình 1 và Hình 2 giống nhau hơn
Trong bài viết này, chúng tôi sẽ cố gắng mở một hình ảnh bằng cách sử dụng thư viện OpenCV [Open Source Computer Vision]. Các loại tệp sau đây được hỗ trợ trong thư viện OpenCV
- Windows bitmap – *. bmp, *. ngâm nga
- Tệp JPEG – *. jpeg, *. jpg
- Biểu đồ minh họa mạng lưới không dây - *. png
- WebP – *. trang web
- Raster mặt trời – *. thưa ngài, *. ras
- Tệp TIFF – *. tiff, *. tif
- Dữ liệu không gian địa lý Raster và Vector được hỗ trợ bởi GDAL
Để sử dụng được thư viện OpenCV trong python thì điều kiện tiên quyết chúng ta cần cài đặt các thư viện này
- Thư viện Numpy. Máy tính xử lý hình ảnh ở dạng ma trận mà NumPy được sử dụng và OpenCV sử dụng nó trong nền
- Trăn OpenCV. Thư viện OpenCV trước đây là cv nhưng phiên bản cập nhật là cv2. Nó được sử dụng để thao tác hình ảnh và video.
Để cài đặt các thư viện này, chúng ta cần chạy các lệnh pip này trong cmd
pip install opencv-python pip install numpy pip install matplotlib
Các bước để đọc và hiển thị một hình ảnh trong OpenCV là
1. Đọc ảnh bằng hàm imread[]
2. Tạo cửa sổ GUI và hiển thị hình ảnh bằng hàm imshow[]
3. Sử dụng hàm waitkey[0] để giữ cửa sổ hình ảnh trên màn hình theo số giây đã chỉ định, o nghĩa là cho đến khi người dùng đóng nó, nó sẽ giữ cửa sổ GUI trên màn hình
4. Xóa cửa sổ hình ảnh khỏi bộ nhớ sau khi hiển thị bằng hàm destroyAllWindows[]
Hãy bắt đầu đọc một hình ảnh. sử dụng cv2.
Để đọc hình ảnh cv2. phương thức imread[] được sử dụng. Phương thức này tải một hình ảnh từ tệp được chỉ định. Nếu hình ảnh không thể đọc được [do tệp bị thiếu, quyền không phù hợp, định dạng không được hỗ trợ hoặc không hợp lệ] thì phương thức này sẽ trả về một ma trận trống.
cú pháp. cv2. imread[đường dẫn, cờ]
Thông số.
đường dẫn. Một chuỗi đại diện cho đường dẫn của hình ảnh được đọc.
cờ. Nó chỉ định cách đọc hình ảnh. Giá trị mặc định của nó là cv2. IMREAD_COLORGiá trị trả về. Phương thức này trả về một hình ảnh được tải từ tệp đã chỉ định
Ghi chú.
- Hình ảnh phải nằm trong thư mục làm việc hoặc phải cung cấp đường dẫn đầy đủ của hình ảnh
- Theo mặc định, OpenCV lưu trữ hình ảnh màu ở định dạng BGR [Xanh lam và Đỏ]
Tất cả ba loại cờ được mô tả dưới đây
cv2. IMREAD_COLOR. Nó chỉ định tải một hình ảnh màu. Mọi độ trong suốt của hình ảnh sẽ bị bỏ qua. Nó là cờ mặc định. Ngoài ra, chúng ta có thể truyền giá trị nguyên 1 cho cờ này.
cv2. IMREAD_GRAYSCALE. Nó chỉ định tải một hình ảnh ở chế độ thang độ xám. Ngoài ra, chúng ta có thể truyền giá trị nguyên 0 cho cờ này.
cv2. IMREAD_UNCHANGED. Nó chỉ định tải một hình ảnh như vậy bao gồm cả kênh alpha. Ngoài ra, chúng ta có thể truyền giá trị nguyên -1 cho cờ này.
Các mã dưới đây là các triển khai để đọc hình ảnh và hiển thị hình ảnh trên màn hình bằng các hàm thư viện OpenCV và matplotlib.
Ví dụ #1 [Sử dụng OpenCV].
Hình ảnh được sử dụng là
Python3
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]6
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]7
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]8
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]9
print["Matching Image 1 with Image 2:", ret12]0
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]00
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]01
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]02____103
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]04
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]05
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]06
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]07
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]08
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]09
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse00
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse01
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse02
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse03
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse04
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse05
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse06
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse07
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse08
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse09
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]00
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]01
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]02
đầu ra
Đọc hình ảnh bằng cv2 ở định dạng BGR
Chúng ta có thể nhìn thấy hình dạng, tôi. e. , chiều rộng và chiều cao và các kênh của hình ảnh bằng thuộc tính hình dạng
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]0
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse0
Thư viện Matplotlib sử dụng định dạng màu RGB để đọc ảnh màu. Ở đây chúng tôi đang trình bày một ví dụ về đọc một hình ảnh bằng thư viện này.
Ví dụ #2
Python3
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]03
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]7
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]05
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]7
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]07
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]00
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]01
img1 = cv2.imread['panda.png'] img2 = cv2.imread['panda1.png'] img1 = cv2.cvtColor[img1, cv2.COLOR_BGR2GRAY] img2 = cv2.cvtColor[img2, cv2.COLOR_BGR2GRAY]02
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]11
def mse[img1, img2]: h, w = img1.shape diff = cv2.subtract[img1, img2] err = np.sum[diff**2] mse = err/[float[h*w]] return mse09
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]13
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]14
print["Image matching Error between the two images:", mse] cv2.imshow["Contour", img] cv2.waitKey[0] cv2.destroyAllWindows[]15
Đọc ảnh bằng cv2 và hiển thị bằng matplotlib sẽ hiển thị ảnh ở định dạng BGR
Ghi chú. Xem sự khác biệt về màu sắc của hình ảnh được đọc bởi thư viện cv2 và matplotlib. Vì cv2 sử dụng định dạng màu BGR và matplotlib sử dụng định dạng màu RGB. Để chuyển đổi BGR sang RGB, chúng tôi sử dụng một chức năng