Cắt ảnh dựa trên Edge Detection Python

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
________số 8

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 np
image = 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]
0

Hì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]
1

Có 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]
2

Là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]
3

Cắ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]
4

Cắ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]
5

Sự 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

Chủ Đề