Xin lỗi tôi không biết OpenCV và đây là bước xử lý trước hơn là câu trả lời hoàn chỉnh:
Đầu tiên, bạn không muốn một máy dò cạnh. Một máy dò cạnh chuyển đổi các chuyển tiếp (như bóng tối này sang ánh sáng):
thành những đường vân (vạch sáng trên bóng tối) như thế này:
Nó thực hiện một sự khác biệt, nói cách khác.
Nhưng trong hình ảnh của bạn, có một ánh sáng chiếu xuống từ một hướng, cho chúng ta thấy sự nhẹ nhõm của bề mặt 3D. Chúng tôi coi đây là đường và cạnh, bởi vì chúng tôi thường thấy mọi thứ ở chế độ 3D, nhưng chúng không thực sự, đó là lý do tại sao máy dò cạnh không hoạt động và khớp mẫu sẽ không hoạt động dễ dàng với hình ảnh được xoay (hoàn hảo khớp ở 0 độ xoay thực sự sẽ hủy hoàn toàn ở 180 độ, vì ánh sáng và bóng tối sẽ thẳng hàng với nhau).
Nếu chiều cao của một trong những đường mazy này trông như thế này từ phía bên:
sau đó chức năng độ sáng khi được chiếu sáng từ một phía sẽ như thế này:
Đây là những gì bạn nhìn thấy trong hình ảnh của bạn. Bề mặt trở nên sáng hơn và bề mặt dấu trở nên tối hơn. Vì vậy, bạn không muốn phân biệt. Bạn cần tích hợp hình ảnh theo hướng chiếu sáng, và nó sẽ cung cấp cho bạn bản đồ chiều cao ban đầu của bề mặt (xấp xỉ). Sau đó, sẽ dễ dàng hơn để khớp mọi thứ, cho dù thông qua biến đổi Hough hoặc khớp mẫu hoặc bất cứ điều gì.
Tôi không chắc chắn làm thế nào để tự động hóa việc tìm hướng chiếu sáng. Nếu nó giống nhau cho tất cả các hình ảnh của bạn, tuyệt vời. Nếu không, bạn phải tìm đường tương phản lớn nhất và giả sử ánh sáng vuông góc với nó hoặc một cái gì đó. Ví dụ của tôi, tôi xoay hình ảnh theo cách thủ công theo hướng tôi nghĩ là đúng hướng, với ánh sáng đến từ bên trái:
Tuy nhiên, bạn cũng cần xóa tất cả các thay đổi tần số thấp trong hình ảnh, để chỉ làm nổi bật các tính năng giống như dòng thay đổi nhanh chóng. Để tránh các tạo tác đổ chuông, tôi đã sử dụng hiệu ứng làm mờ 2D Gaussian và sau đó trừ nó khỏi bản gốc:
Việc tích hợp (tổng tích lũy) có thể chạy trốn dễ dàng, tạo ra các vệt ngang. Tôi đã loại bỏ chúng bằng một đường chuyền cao Gaussian khác, nhưng chỉ theo hướng ngang lần này:
Bây giờ các lỗ khí có hình elip màu trắng xung quanh, thay vì màu trắng ở một số nơi và màu đen ở những nơi khác.
Nguyên:
Tích hợp:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
Biến đổi Hough có thể được sử dụng để phát hiện các hình elip như thế này, được làm bằng "pixel cạnh", mặc dù nó thực sự tốn kém về tính toán và bộ nhớ, và chúng không phải là hình elip hoàn hảo nên nó phải là một bộ phát hiện "cẩu thả". Tôi chưa bao giờ thực hiện nó, nhưng có rất nhiều kết quả của Google cho " phát hiện hình elip ". Tôi muốn nói rằng nếu bạn phát hiện một hình elip bên trong cái kia, trong một không gian tìm kiếm có kích thước nhất định, nó sẽ được tính là một lỗ hổng.
Cũng thấy: