Tôi có hình ảnh sau đây phát hiện hình chữ nhật mờ trên grayscaleimage đa phương
Tôi đang cố gắng để tìm tọa độ pixel của hình chữ nhật chính (những giữa các dòng trắng). Tôi đã thử vài thứ nhưng tôi không thể có được giải pháp đủ tốt. Các giải pháp không phải là hoàn hảo và nó ok nếu không phải tất cả các hình chữ nhật được phát hiện (đặc biệt là những người thực sự nhỏ). Mặc dù vị trí góc sẽ phải càng chính xác càng tốt, đặc biệt là với những mờ lớn hơn (Tôi đang cố gắng để viết một số động cơ AR đơn giản).
Tôi có thể làm rõ chỉ có 4 cấp độ của màu xám: 0, 110, 180 và 255 (khi in, không có màn hình nó sẽ thay đổi vì sét và bóng tối)
Cho đến nay tôi đã cố gắng vài điều:
- thủ ngưỡng đa cấp (vì bóng tối và sét khác nhau nó đã không làm việc)
- adaptive ngưỡng: 2 vấn đề:
- nó kết hợp 180 và 255 màu sắc trong sang màu trắng, và 0, 110 thành đen
- cạnh/góc vị trí của mờ hình chữ nhật (lớn hơn) không phải là chính xác (nó cho biết thêm mờ để hình chữ nhật diện tích)
- phát hiện cạnh Sobel (góc của hình chữ nhật mờ sắc nét hơn , nhưng nó cũng phát hiện các cạnh bên trong hình chữ nhật, các đường viền cạnh đó không phải lúc nào cũng đóng
Có vẻ như kết hợp hai suy nghĩ này sẽ mang lại kết quả tốt hơn. Hoặc có lẽ ai đó có ý tưởng khác?
Tôi cũng đang nghĩ đến việc thực hiện lũ lụt, nhưng thật khó để tìm điểm và ngưỡng hạt giống chắc chắn tự động (có thể có một số đối tượng màu trắng khác trong nền). Bên cạnh đó tôi sẽ muốn tối ưu hóa sau này cho GPU và thuật toán lũ lụt là không phù hợp cho việc này.
Dưới đây là một số mẫu mã tôi đã cố gắng cho đến nay:
image = cv2.imread('data/image.jpg');
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('image', gray)
adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 601, 0)
cv2.imshow('adaptive', adaptive)
gradx = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=3)
grady = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=3)
abs_gradx = cv2.convertScaleAbs(grady)
abs_grady = cv2.convertScaleAbs(grady)
grad = cv2.addWeighted(abs_gradx, 0.5, abs_grady, 0.5, 0)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
grad = cv2.morphologyEx(grad, cv2.MORPH_OPEN, kernel)
grad = cv2.morphologyEx(grad, cv2.MORPH_CLOSE, kernel)
cv2.imshow('sobel',grad)
#kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(7,7))
#grad = cv2.morphologyEx(grad, cv2.MORPH_OPEN, kernel)
retval, grad = cv2.threshold(grad, 10, 255, cv2.THRESH_BINARY)
cv2.imshow('sobel+morph+thrs',grad)
cv2.waitKey()
Bạn đã từng xem xét phát hiện góc? – Junuxx
vâng tôi đã thử goodFeaturesToTrack và ở đó có nhiều tài sản giả mạo – pzo
Chỉ cần làm rõ mục tiêu. Bạn có dải trắng lớn phác thảo hình vuông, có đầy đủ các hình chữ nhật (một số trong đó là hình vuông là tốt). Bạn có muốn các góc của hình vuông lớn, các góc của hình chữ nhật nhỏ làm đầy các hình vuông hoặc cả hai? – Hammer