Học sâu được sử dụng để phân tích, xác định và tạo ra sự hiểu biết thông minh về các đối tượng trong một hình ảnh. Một số ứng dụng phổ biến là Phân loại hình ảnh, Phát hiện đối tượng, Phân đoạn trường hợp, v.v. Do đó, bắt buộc phải có kiến thức vững chắc về các kỹ thuật xử lý hình ảnh như cải tiến hình ảnh bao gồm cắt xén hình ảnh, loại bỏ nhiễu có trong hình ảnh hoặc xoay hình ảnh, v.v. , để xây dựng tập dữ liệu huấn luyện tốt hơn
Các kỹ thuật xử lý hình ảnh cũng hữu ích không kém cho Nhận dạng ký tự quang học [OCR]
Các kỹ thuật xử lý hình ảnh làm tăng khả năng giải thích của hình ảnh để phân loại hoặc phát hiện các đối tượng có trong hình ảnh bằng cách giúp xác định các tính năng chính hoặc để đọc văn bản từ hình ảnh
Ảnh của Nick Fewings trên Bapt
Mã và hình ảnh có sẵn ở đây
Nhập thư viện cần thiết
import cv2
from PIL import Image
Trước tiên hãy hiển thị hình ảnh bằng OpenCV và PIL
Đọc và hiển thị hình ảnh bằng OpenCV
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
Nếu hình ảnh quá lớn, thì cửa sổ hiển thị hình ảnh sẽ không vừa với màn hình
Vậy làm cách nào để hiển thị hình ảnh đầy đủ trên màn hình?
Theo mặc định, bạn sẽ có màn hình bị cắt khi hiển thị hình ảnh quá khổ. Để xem hình ảnh đầy đủ, bạn sẽ sử dụng tênWindow[tên, cờ] của OpenCV để tạo một cửa sổ mới. Tham số đầu tiên, tên, là chú thích cho cửa sổ và sẽ được sử dụng làm mã định danh. Khi bạn đặt cờ thành cv2. WINDOW_NORMAL, thì hình ảnh đầy đủ sẽ được hiển thị và bạn có thể thay đổi kích thước cửa sổ. Có các tùy chọn khác cho tham số cờ
# Resizing the image for the user to resize the window
image = cv2.imread[r'love.jpg']
cv2.namedWindow['Normal Window', cv2.WINDOW_NORMAL]
cv2.imshow['Normal Window', image]
cv2.waitKey[0]
Thay đổi kích thước hình ảnh
Khi chúng tôi thay đổi kích thước hình ảnh, chúng tôi thay đổi chiều cao hoặc chiều rộng hoặc cả hai hình ảnh và duy trì tỷ lệ khung hình. Tỷ lệ khung hình của hình ảnh là tỷ lệ giữa chiều rộng của hình ảnh với chiều cao của nó
image= cv2.imread[r'taj.jpg']
scale_percent =200 # percent of original size
width = int[image.shape[1] * scale_percent / 100]
height = int[image.shape[0] * scale_percent / 100]
dim = [width, height]
resized = cv2.resize[image, dim, interpolation = cv2.INTER_AREA]
cv2.imshow["Resize", resized]
cv2.waitKey[0]
Đọc và hiển thị hình ảnh bằng PIL
Bạn sẽ tải hình ảnh bằng open[] và sau đó sử dụng show[] để hiển thị
hình ảnh. show[] tạo một tệp tạm thời
pil_image= Image.open[r'love.jpg']
pil_image.show["PIL Image"]
Điều gì sẽ xảy ra nếu bạn quan tâm đến việc xác định các cạnh hoặc các tính năng khác trong ảnh?
Một hình ảnh thang độ xám được sử dụng để xác định các cạnh. Hình ảnh thang độ xám cũng hữu ích để hiểu độ tương phản hoặc độ dốc bóng có trong hình ảnh và hiểu vai trò của chúng để phân tích các tính năng của hình ảnh
Hình ảnh RGB có ba kênh Đỏ, Xanh lục và Xanh lam, so với kênh 2D cho hình ảnh thang độ xám. Sẽ có ít thông tin trên mỗi pixel hơn đối với ảnh thang độ xám so với ảnh màu và do đó thời gian xử lý ảnh thang độ xám sẽ nhanh hơn
Chia tỷ lệ màu xám cho hình ảnh màu bằng OpenCV
Chúng tôi đang chuyển đổi một hình ảnh màu sang thang độ xám bằng cách sử dụng cvtColor[], thao tác này sẽ lưu hình ảnh từ không gian màu này sang không gian màu khác
#Converting image to grayscale
image = cv2.imread[r'love.jpg']
gray_image= cv2.cvtColor[image, cv2.COLOR_RGB2GRAY]
cv2.namedWindow['Gray Image', cv2.WINDOW_NORMAL]
cv2.imshow['Gray Image', gray_image]
cv2.waitKey[0]
Chia tỷ lệ xám cho hình ảnh màu bằng PIL
convert[] trả về một bản sao đã chuyển đổi của hình ảnh này;
# Gray image using PIL
pil_image= Image.open[r'love.jpg']
gray_pil=pil_image.convert['L']
gray_pil.show[]
Phát hiện cạnh bằng OpenCV
Cạnh trong hình ảnh được phát hiện bằng bộ dò cạnh canny. Máy dò cạnh Canny sử dụng hình ảnh thang độ xám bằng thuật toán nhiều giai đoạn
Khôn ngoan[]. đối số đầu tiên là hình ảnh đầu vào và đối số thứ hai và thứ ba là các giá trị ngưỡng1 và ngưỡng2
Các cạnh có gradient cường độ lớn hơn ngưỡng 2 được coi là cạnh và những cạnh dưới ngưỡng 1 không phải là cạnh. Các cạnh không phải sẽ bị xóa. Bất kỳ giá trị cường độ gradient nào giữa hai ngưỡng được phân loại là cạnh hoặc không cạnh dựa trên kết nối của chúng
image= cv2.imread[r'taj.jpg']
cv2.namedWindow["Edge", cv2.WINDOW_NORMAL]
denoised_image = cv2.Canny[image, 100,200 ]
cv2.imshow["Edge", denoised_image]
cv2.waitKey[0]
Máy dò cạnh Canny
Điều gì sẽ xảy ra nếu hình ảnh bị lệch hoặc hơi xoay và bạn muốn làm lệch hình ảnh?
OCR trên văn bản bị lệch không hoạt động tốt và do đó chúng tôi cần phải xóa. Hình ảnh có thể được xử lý bằng cách sử dụng rotate[] của OpenCV và PIL
Xoay hình ảnh bằng OpenCV
rotate[] sẽ xoay hình ảnh dựa trên rotateCode, được chỉ định làm tham số thứ hai cho hàm rotate
Giá trị cho rotateCode là
- cv2. XOAY_90_CHIỀU ĐỒNG HỒ,
- cv2. XOAY_90_COUNTERCHIỀU ĐỒNG HỒ
- cv2. XOAY_180
Hình ảnh được xoay 90 độ theo chiều kim đồng hồ bằng OpenCV
Nếu tôi chỉ muốn xoay hình ảnh theo một góc cụ thể thì sao?
Xoay hình ảnh dựa trên một góc cụ thể
Trong mã bên dưới, hình ảnh được xoay theo gia số 60 độ bằng cách sử dụng rotate[] của imutils
import imutils
import numpy as npimage = cv2.imread[r'love.jpg']# loop over the rotation angles
for angle in np.arange[0, 360, 60]:
cv2.namedWindow["Rotated", cv2.WINDOW_NORMAL]
rotated = imutils.rotate[image, angle]
cv2.imshow["Rotated", rotated]
cv2.waitKey[0]
hình ảnh được xoay theo gia số 60 độ bằng cách sử dụng imutils
Xoay hình ảnh bằng PIL
Ở đây hình ảnh được xoay 110 độ bằng PIL
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
0Hình ảnh được xoay 110 độ bằng PIL
Làm cách nào để nâng cao chất lượng hình ảnh khi nó bị giảm chất lượng do nhiễu và ảnh hưởng đến quá trình phân tích hình ảnh?
Khử nhiễu hình ảnh bằng OpenCV
Nhiễu là tín hiệu không mong muốn và về mặt hình ảnh, đó là sự biến đổi ngẫu nhiên của màu sắc
Giảm thiểu nhiễu có trong ảnh bằng OpenCV
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
1Có nhiều phương pháp khác nhau trong OpenCV để loại bỏ nhiễu khỏi hình ảnh. Cái được sử dụng dưới đây là cv. fastNlMeansDenoisingColored[], loại bỏ nhiễu khỏi ảnh màu
Các đối số phổ biến cho các phương thức fastNIMeansDenoising là
- src. hình ảnh nguồn
- dst. hình ảnh đầu ra có cùng kích thước và loại như src
- h. điều chỉnh cường độ bộ lọc. Giá trị h cao hơn sẽ loại bỏ hoàn toàn nhiễu cùng với chi tiết hình ảnh, giá trị h nhỏ hơn sẽ bảo toàn chi tiết hình ảnh cùng với một số nhiễu
- hForColorThành phần. giống như h, nhưng chỉ dành cho ảnh màu và thường giống như h
- mẫuCửa sổKích thước. nên là số lẻ. [khuyến nghị 7]
- tìm kiếmWindowSize. nên là số lẻ. [khuyến nghị 21]
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
2Làm cách nào để trích xuất các vùng quan tâm nhất định từ một hình ảnh?
Cắt xén hình ảnh
Cắt hình ảnh cho phép bạn trích xuất khu vực quan tâm trong hình ảnh
Chúng tôi sẽ cắt hình ảnh của TajMahal và chỉ giữ lại TajMahal và loại bỏ các chi tiết khác khỏi hình ảnh
Cắt ảnh bằng OpenCV
Việc cắt xén trong OpenCV được thực hiện bằng cách cắt mảng hình ảnh trong đó chúng tôi chuyển điểm đầu và điểm cuối của tọa độ y theo sau là điểm đầu và điểm cuối của tọa độ x
hình ảnh[y_start. y_end, x_start. x_end]
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
3Cắt ảnh bằng PIL
crop[] của PIL cho phép chúng ta cắt một vùng hình chữ nhật của hình ảnh, Tham số của crop[] là tọa độ trái, tọa độ trên, tọa độ phải và tọa độ pixel dưới cùng
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
4Cắt ảnh bằng PIL
Phù hợp với mẫu
Bạn có thể cung cấp một mẫu và tìm kiếm mẫu đó trong một hình ảnh và trích xuất vị trí của nó bằng cách sử dụng matchTemplate[] của OpenCV
Mẫu trượt trên toàn bộ hình ảnh giống như một mạng thần kinh tích chập và cố gắng khớp mẫu với hình ảnh đầu vào
minMaxLoc[] được sử dụng để lấy giá trị tối đa/tối thiểu, sẽ là góc trên cùng bên trái của hình chữ nhật cùng với chiều rộng và chiều cao
Có 6 phương pháp có sẵn để đối sánh mẫu
- cv2. TM_SQDIFF
- cv2. TM_SQDIFF_NORMED
- cv2. TM_CCORR
- cv2. TM_CCORR_NORMED
- cv2. TM_CCOEFF
- cv2. TM_CCOEFF_NORMED
Trong ví dụ bên dưới, tôi đã cắt một phần nhỏ từ hình ảnh chính để tạo mẫu
Phương thức được sử dụng để so khớp mẫu là TM_CCOEFF_NORMED. Ngưỡng cho trận đấu được đặt thành 0. 95. Nó khoanh vùng vị trí có xác suất trùng khớp cao hơn 95% và sau đó vẽ một hình chữ nhật xung quanh khu vực tương ứng với khớp
# Reading and Displaying the file
image = cv2.imread[r'love.jpg']
cv2.imshow["Image", image]
cv2.waitKey[0]
5Sự kết luận
Chúng ta đã thảo luận về các kỹ thuật xử lý hình ảnh phổ biến nhất có thể được sử dụng để phân tích hình ảnh để Phân loại hình ảnh, Phát hiện đối tượng cũng như OCR