Tìm hình vuông trong hình ảnh


34

Tôi cần tìm các hình vuông trong một hình ảnh bằng cách sử dụng OpenCV (không có vấn đề gì trong MATLAB hoặc bất kỳ hình thức nào khác, nói chung những gì tôi mong đợi là một số ý tưởng).

Hãy xem xét hình ảnh thử nghiệm dưới đây:

nhập mô tả hình ảnh ở đây

Tôi cần tìm những ô vuông màu trong hình trên một cách chính xác (không phải các dải dài màu trắng).

Những gì tôi đã làm xong :

  • Tôi đã áp dụng phương pháp phổ biến (đi kèm với các mẫu OpenCV), tức là tìm các đường viền trong tất cả các mặt phẳng màu, xấp xỉ nó và kiểm tra số phần tử = 4. Nó hoạt động đến một số mở rộng rằng, một vài hình vuông được phát hiện, đặc biệt là những hình tối.

  • Bước tiếp theo tôi đã làm là dự đoán . tức là sự sắp xếp này là cố định . Vì vậy, nếu một số thu được, tôi có thể dự đoán những cái còn lại. Nó cũng làm việc để một số mở rộng hơn nữa. Nhưng độ chính xác là rất xấu.

Nhưng tôi cảm thấy dự đoán không phải là một phương pháp tốt ở đây và nó không phải lúc nào cũng cung cấp câu trả lời chính xác như được đưa ra bởi bước đầu tiên.

Tôi cân gi :

1) Có phương pháp nào khác tốt hơn để phát hiện các ô vuông này chính xác hơn không? Hay nhiều phương pháp?

Một điểm quan trọng là, thời gian không phải là vấn đề ở đây . Thuật toán có thể chậm, không thành vấn đề. Nhưng độ chính xác là tiêu chí chính.

Đôi khi, hình ảnh có thể mờ hơn nhiều.

Và một trong những vấn đề lớn mà tôi gặp phải là một số hình vuông có màu gần giống với màu nền (kiểm tra cột 3 hình vuông thứ nhất và thứ hai).

Tìm kiếm ý tưởng, cảm ơn trước

CẬP NHẬT:

Dưới đây là kết quả chính xác tối đa tôi nhận được:

nhập mô tả hình ảnh ở đây

Tất nhiên, hình ảnh kết quả được thay đổi kích thước một chút.

CẬP NHẬT 2:

Tôi đã đưa ra một giải pháp tốt hơn nhiều trong câu trả lời của mình dưới đây: https://dsp.stackexchange.com/a/7526/818


nền của bạn luôn trắng?

1
ý tưởng của tôi là tính toán độ bão hòa và ngưỡng sat img nhưng sử dụng ví dụ của bạn thì nó không hoạt động tốt (tính bão hòa ở mức tối đa (RG, RB, GB). Thực tế là một số hình vuông trông gần giống như nền Điều này khá khó. Nếu tất cả các hình ảnh của bạn có cùng một mẫu (sọc trắng dài có hình vuông bên cạnh), bạn nên xem xét việc tìm các bit dễ nhất (chẳng hạn như hình vuông thực sự có màu hoặc sọc trắng) suy ra vị trí có thể khác hình vuông và ... tìm cách kiểm tra xem chúng có thực sự ở đó hay không. Thật thú vị nhưng bạn có thể đưa ra nhiều hình ảnh hơn không?

Chà, tôi nghĩ cái này không nên di chuyển.
Junuxx

1
Bạn có thể cung cấp thêm hình ảnh? Ngoài ra, điều này là gì?
Andrey Rubshtein

2
OP cần trả lời một số câu hỏi. Có lẽ nền trắng là không cần thiết. Và những gì với ánh sáng? Nó sẽ là xấu? Chúng trông phức tạp không cần thiết với tôi.
Tae-Sung Shin

Câu trả lời:


9

Lần thử đầu tiên sử dụng Matlab:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

Kết quả trong các khu vực sau:

vùng được dán nhãn

Như bạn có thể thấy, việc chọn ngưỡng dẫn đến số vùng cao nhất (T = 120) sẽ cung cấp 7 vị trí chính xác, một số vị trí được hợp nhất, một dương tính giả và hai âm tính giả.

Đây là một nỗ lực khá đơn giản nhưng tôi nghĩ nó cho thấy phương pháp này hiệu quả. Thêm một số nội dung để chia nhỏ các vùng kéo dài hoặc thực hiện điều này cho từng kênh màu riêng biệt chỉ là một vài điều bạn có thể làm để cải thiện điều này.

Nó cũng sẽ giúp nếu bạn cung cấp thêm một vài hình ảnh thử nghiệm.


8

Tôi đã thử một cái gì đó khác để cải thiện kết quả của tôi trong câu hỏi. Giải pháp dưới đây dựa trên giả định rằng hình vuông đầu tiên (màu cam) luôn được phát hiện ở bước 1. Và nó thực tế do màu tương phản cao của nó so với nền. Ngay cả kết quả tôi đưa ra trong câu hỏi cũng đã phát hiện ra nó một cách chính xác

Bước 1: Tìm càng nhiều hình vuông càng tốt

Tôi chia hình ảnh thành các mặt phẳng R, G, B, H, S, V và ngưỡng hình ảnh cho các giá trị ngưỡng khác nhau như bội số 25. Với mỗi hình ảnh, tôi tìm thấy hình vuông trong đó và đặt chúng vào một "hình ảnh mặt nạ" . Tôi cũng tìm thấy chiều cao và chiều rộng trung bình của hình vuông.

hình ảnh mặt nạ (Tổng cộng 7/12 ô vuông được phát hiện):

hình ảnh mặt nạ

Bước 2: Hình thành một lưới các ô vuông

Tiếp theo tôi tìm thấy trọng tâm của những hình vuông này trong hình ảnh mặt nạ. Sắp xếp chúng và tìm thấy tâm của hình vuông đầu tiên (màu cam). Từ phân tích chặt chẽ, chúng ta có thể thấy khoảng cách giữa hai hình vuông là một hình vuông theo cả hai chiều ngang và dọc. Vì vậy, theo cách này, tôi đã tạo ra một lưới các ô vuông như bên dưới và gọi nó là lí tưởng (nó chỉ là một cái tên, nó không có nghĩa đây là đầu ra tôi cần):

lý tưởng

hình ảnh lý tưởng

Bước 3: Sắp xếp lại lý tưởng_image

Bây giờ chúng ta có các centroid lý tưởng và centroid ban đầu. Tôi đã tìm ra các kết quả khớp chính xác cho từng centroid ban đầu từ lý tưởng_centroid (bằng cách lấy khoảng cách euclide giữa chúng). Sau đó, tôi đã sử dụng Scipy interpolate.griddata để nội suy và ánh xạ lại lý tưởng_image theo các giá trị trung tâm (nó gần giống như cong vênh được thực hiện trong các Hỏi & Đáp này: Cách loại bỏ các khiếm khuyết lồi trong hình vuông sudokuchuyển đổi hình ảnh trong OpenCV ). Vì vậy, dưới đây là đầu ra tôi nhận được:

Đầu ra:

Hình ảnh đầu ra

Bước 4: HOẶC hoạt động trên đầu ra với hình ảnh mặt nạ từ bước đầu tiên

đầu ra cuối cùng

Bây giờ bạn có thể thấy tất cả các hình vuông được phát hiện, nhưng với một vấn đề được đề cập dưới đây:

Vấn đề :

Nhìn vào đầu ra của Bước 3, tức là hình ảnh được ánh xạ lại của lưới vuông. Ngoại trừ hai hình vuông trung tâm, tất cả các hình vuông khác được cắt bớt. Đây là một vấn đề liên quan đến ánh xạ lại này. Tôi không chắc vấn đề ở đâu, với scipy.interpolate.griddata () hoặc cv2.remap (). Tôi nghĩ rằng toàn bộ hình ảnh sẽ bị biến dạng, nhưng nó không phải là. Nó chỉ cong hình ảnh bên trong các trung tâm chúng tôi đã đưa ra. Nếu tôi có thể sửa nó, đầu ra sẽ ổn.

Vì vậy, nếu ai đó biết một ý tưởng tốt cho điều đó, chào mừng nhất !!!


5

Lưu ý: Phương pháp này sẽ rất chậm.

Tạo một mặt nạ trông giống như các đường viền của một đối tượng lý tưởng. Tương tự như thế này:

mặt nạ của đối tượng

sau đó trượt (vị trí, tỷ lệ, xoay) mặt nạ trên hình ảnh và khớp với đường viền của hình ảnh thật (có lẽ làm mờ một chút để có phản ứng mềm hơn) để tính toán mức độ giống nhau của chúng, (vị trí, tỷ lệ, xoay) với đáp ứng tương tự cao nhất phải là (vị trí, tỷ lệ, xoay) của đối tượng thực.

Phương thức không quan tâm các hình vuông hòa trộn vào nền hoặc thậm chí là một phần của đối tượng, vì nó xem xét toàn bộ đối tượng.

Cá nhân tôi đã sử dụng phương pháp này thành công để theo dõi mõm chuột và râu ria, nhưng tôi có một số giả định gần với vị trí được biết đến cuối cùng, v.v. Nhưng tôi nghĩ bạn có thể hạ thấp không gian tìm kiếm bằng cách áp dụng một số giả định như: kích thước có thể của đối tượng trong máy ảnh, nó có thể cách trung tâm bao xa hoặc xoay <10degrees, v.v.


5

Bước 1: Bất kể hình ảnh nhị phân cuối cùng nào bạn nhận được từ việc phân tích trong mặt phẳng B, G, R, H, S, V, trong hình ảnh đó thực hiện thuật toán đếm blob.

Bước 2: Tìm blob lớn nhất trên cơ sở diện tích hoặc chiều dài đường viền. Vì các đốm màu của bạn sẽ chủ yếu là các loại hình bình hành nên diện tích hoặc đường viền, bất kỳ ai cũng sẽ làm được.

Bước 3: Với blob lớn nhất (vì blob lớn nhất là blob tốt nhất giống với hình vuông trong thế giới thực của bạn) hãy thử tìm hướng của blob ... điều này bạn có thể có được bằng một hình chữ nhật phù hợp nhất HOẶC bạn có thể lấy điểm góc ... có được độ dốc của các đường nối chúng (theo cả đường chân trời và hướng dọc).

Bước 4: Khi bạn nhận được hai dốc, vẽ hai đường chạy qua trục của blob. đối với trục bạn có thể tính trung bình các điểm góc hoặc bạn có thể sử dụng trọng tâm (tâm khối lượng) ... Tôi sẽ đi với điểm trung bình ...

Bước 5: Vì ở mỗi hướng ngang và dọc, khoảng cách đều bằng nhau (khoảng cách ngang và dọc lý tưởng cũng bằng nhau vì nó xuất phát từ hình vuông lý tưởng của bạn nhưng chúng tôi sẽ không giả sử nó ..) chỉ cần xác định vị trí các tâm có thể có của nhau. hình bình hành

LINE BOTTOM: Nếu bất kỳ một hình vuông nào được phát hiện hoàn hảo, bạn có thể tạo toàn bộ lưới. Chỉ cần giữ các tâm đánh dấu ở khoảng 2H (H = chiều rộng ngang của blob lớn nhất) dọc theo trục ngang của blob lớn nhất và ở khoảng cách 2V (V = chiều cao của blob lớn nhất) theo chiều dọc dọc theo trục dọc của blob.

Một số bức ảnh để hỗ trợ nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1
+1 - Sẽ thật tuyệt nếu bạn có thể thực hiện nó.
Abid Rahman K

2
@AbidRahmanK Đó không phải là những gì StackExchange dành cho. Câu hỏi -> Trả lời. Nếu không, điều này sẽ trở thành một hội chợ việc làm.
Jan Krüger

2

sự sắp xếp này là cố định

Tôi thực sự không biết loại dự đoán nào bạn đã làm trước đây, nhưng bạn đã cố tập trung vào các dải dài màu trắng như một gốc rễ. Sau đó (nếu 3 cột hình vuông có kích thước bằng nhau), bạn có thể phát hiện chiều cao của hình vuông (khoảng cách giữa hai dải) và bạn có thể phát hiện diện tích tối đa và tối thiểu (chiều cao và chiều rộng) trong hình ảnh.

Sau đó, cố gắng phát hiện màu phổ biến nhất bên trong toàn bộ hình vuông của bạn và đặt nó thành một khu vực "không vuông". Phần còn lại được cho là hình vuông bạn đang tìm kiếm.


Tôi tìm thấy 3-4 hình vuông bằng phương pháp đường viền. Sau đó có chiều cao và chiều rộng của mỗi hình vuông. Sau đó kiểm tra khoảng cách giữa các hình vuông được phát hiện và giả định nếu khoảng cách giữa chúng đủ lớn để giữ một hình vuông khác. Đó là dự đoán tôi đã thực hiện.
Abid Rahman K

Một số hình vuông có màu gần giống như màu nền. Vì vậy, tôi sợ, họ cũng sẽ được coi là khu vực không vuông theo phương pháp của bạn.
Abid Rahman K

Có lẽ bạn có thể thử làm việc trên mọi cột để vẽ đường cong trong đó trục x sẽ là chiều cao (tính bằng pixel) trong ảnh và trục y sẽ là cường độ. Sau đó, bạn có thể thử tìm một số cạnh cắt với hình thức phái sinh.

đó là phát hiện cạnh chính nó, phải không? Tôi đã thử nó, nhưng không có kết quả tốt.
Abid Rahman K

1
Đúng vậy, nhưng bạn có thể tự mình thấy tại sao nó thất bại và có thể cô lập một số khu vực thú vị trong cốt truyện. Nhân tiện, nếu bạn tìm thấy một số lời khuyên hữu ích để giải quyết vấn đề của mình, xin vui lòng gửi chúng. Chúc may mắn cho các nghiên cứu của bạn

0

Tôi sẽ đề nghị sử dụng biến đổi Hough, đây là một thuật toán rất mạnh để tìm các hình dạng tham số đơn giản, ví dụ như đường, vòng tròn, vv Phát hiện các dòng sẽ là tốt nhất trong trường hợp của bạn. Bạn có thể tìm thấy các cạnh của các vệt trắng dài ít nhất; sau đó, với bất kỳ thuật toán trích xuất góc nào (Harris hoặc thậm chí Sift hoặc SURF), bạn có thể tìm thấy các góc dọc theo các đường đó, thậm chí sử dụng thực tế là các hình vuông có khoảng cách đều nhau.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.