6

Tôi đang cố gắng tạo một chương trình thị giác máy tính để phát hiện rác và rác ngẫu nhiên trong nền ồn ào như bãi biển (ồn ào do cát).Gặp khó khăn khi phát hiện các vật nhỏ trong nền ồn ào. Có cách nào để sửa lỗi này không?

gốc Hình ảnh:

enter image description here

Canny phát hiện cạnh mà không cần bất cứ xử lý hình ảnh:

enter image description here

Tôi nhận ra rằng sự kết hợp giữa một số kỹ thuật xử lý hình ảnh sẽ giúp tôi hoàn thành mục tiêu của tôi bỏ qua nền cát ồn ào và phát hiện tất cả rác và đồ vật trên mặt đất.

tôi đã cố gắng để phôi trung bình mờ, chơi xung quanh và điều chỉnh các thông số, và nó đã cho tôi điều này:

enter image description here

Nó Preforms tốt về mặt phớt lờ nền cát, nhưng nó thất bại trong việc phát hiện một số của nhiều vật thể khác trên mặt đất, có thể bởi vì nó bị mờ đi (không quá chắc chắn).

Có cách nào để cải thiện thuật toán hoặc kỹ thuật xử lý hình ảnh sẽ bỏ qua nền cát ồn ào trong khi cho phép phát hiện cạnh không thể tìm thấy tất cả các đối tượng và yêu cầu chương trình phát hiện và vẽ đường nét trên tất cả các đối tượng.

Code:

from pyimagesearch.transform import four_point_transform 
from matplotlib import pyplot as plt 
import numpy as np 
import cv2 
import imutils 

im = cv2.imread('images/beach_trash_3.jpg') 


#cv2.imshow('Original', im) 

# Histogram equalization to improve contrast 




### 
#im = np.fliplr(im) 

im = imutils.resize(im, height = 500) 

imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 

# Contour detection 
#ret,thresh = cv2.threshold(imgray,127,255,0) 

#imgray = cv2.GaussianBlur(imgray, (5, 5), 200) 
imgray = cv2.medianBlur(imgray, 11) 

cv2.imshow('Blurred', imgray) 

''' 
hist,bins = np.histogram(imgray.flatten(),256,[0,256]) 
plt_one = plt.figure(1) 
cdf = hist.cumsum() 
cdf_normalized = cdf * hist.max()/ cdf.max() 

cdf_m = np.ma.masked_equal(cdf,0) 
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min()) 
cdf = np.ma.filled(cdf_m,0).astype('uint8') 
imgray = cdf[imgray] 

cv2.imshow('Histogram Normalization', imgray) 
''' 
''' 
imgray = cv2.adaptiveThreshold(imgray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 
      cv2.THRESH_BINARY,11,2) 
''' 

thresh = imgray 

#imgray = cv2.medianBlur(imgray,5) 
#imgray = cv2.Canny(imgray,10,500) 
thresh = cv2.Canny(imgray,75,200) 
#thresh = imgray 
cv2.imshow('Canny', thresh) 


contours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

cnts = sorted(contours, key = cv2.contourArea, reverse = True)[:5] 

test = im.copy() 
cv2.drawContours(test, cnts, -1,(0,255,0),2) 
cv2.imshow('All contours', test) 

print '---------------------------------------------' 
##### Code to show each contour ##### 
main = np.array([[]]) 
for c in cnts: 
    epsilon = 0.02*cv2.arcLength(c,True) 
    approx = cv2.approxPolyDP(c,epsilon,True) 

    test = im.copy() 
    cv2.drawContours(test, [approx], -1,(0,255,0),2) 
    #print 'Contours: ', contours 
    if len(approx) == 4: 
     print 'Found rectangle' 
     print 'Approx.shape: ', approx.shape 
     print 'Test.shape: ', test.shape 

     # frame_f = frame_f[y: y+h, x: x+w] 
     frame_f = test[approx[0,0,1]:approx[2,0,1], approx[0,0,0]:approx[2,0,0]] 

     print 'frame_f.shape: ', frame_f.shape 
     main = np.append(main, approx[None,:][None,:]) 
     print 'main: ', main 


    # Uncomment in order to show all rectangles in image 
    #cv2.imshow('Show Ya', test) 


    #print 'Approx: ', approx.shape 
    #cv2.imshow('Show Ya', frame_f) 
    cv2.waitKey() 
print '---------------------------------------------' 
cv2.drawContours(im, cnts, -1,(0,255,0),2) 
print main.shape 
print main 
cv2.imshow('contour-test', im) 
cv2.waitKey() 
+0

Tôi không chắc chắn nếu câu hỏi là không có chủ đề khi bạn có vẻ như đang yêu cầu đề xuất sử dụng thuật toán nào. –

+0

Được rồi, tôi đã bỏ phiếu. –

+1

hãy thử làm mờ và canny trên hình ảnh HSV (kênh H) thay vì hình ảnh thang độ xám. Và/hoặc sử dụng bộ lọc song phương thay cho trung vị. – Micka

Trả lời

3

những gì tôi hiểu từ vấn đề của bạn là: bạn muốn phân đoạn ra các đối tượng nền trước từ một nền có tính chất biến thiên (mức xám cát phụ thuộc vào nhiều điều kiện khác).

có những cách khác nhau để tiếp cận các loại vấn đề:

Cách tiếp cận 1:

Từ hình ảnh của bạn có một điều rõ ràng rằng, pixel màu nền sẽ luôn luôn nhiều hơn nữa với số lượng hơn foreground, đơn giản nhất phương pháp để bắt đầu phân đoạn ban đầu là:

  1. Chuyển đổi hình ảnh thành màu xám.
  2. Tạo biểu đồ của nó.
  3. Tìm chỉ mục cao nhất của biểu đồ, tức là chỉ mục có pixel tối đa.

trên ba bước cung cấp cho bạn một ý tưởng về nền NHƯNG các trò chơi không được kết thúc ở đây, bây giờ bạn có thể đặt giá trị chỉ số này ở trung tâm và tham gia một loạt các giá trị xung quanh nó như 25 ở trên và dưới, cho Ví dụ: nếu chỉ số đỉnh của bạn là 207 (như trong trường hợp của bạn), hãy chọn phạm vi màu xám từ 75 đến 225 và hình ảnh ngưỡng, Theo tính chất của phương pháp trên, bạn có thể sử dụng để phát hiện đối tượng nền trước, sau khi phân đoạn bạn phải thực hiện một số bước xử lý hậu kỳ như phân tích hình thái để phân đoạn các đối tượng khác nhau sau khi trích xuất đối tượng, bạn có thể áp dụng một số công cụ phân loại cho mức phân đoạn tốt hơn để loại bỏ dương tính giả.

Phương pháp 2:

Chơi với một số liệu thống kê của các điểm ảnh hình ảnh, như làm cho một tập dữ liệu nhỏ các giá trị màu xám và

  1. Nhãn họ lớp 1 và 2, ví dụ 1 cho cát và 2 cho tiền cảnh,
  2. Tìm hiểu giá trị trung bình và độ lệch (độ lệch std) của cả hai lớp và cũng tính toán xác suất cho cả lớp (num_pix_per_class/total_num_pix), bây giờ lưu trữ các thống kê này để sử dụng sau,
  3. Bây giờ, hãy quay lại hình ảnh và chụp từng pixel một và áp dụng một pdf gaussian: 1/2 * pi sigma (exp (- (pix - mean)/2 * sigma)); tại vị trí trung bình đặt giá trị trung bình được tính trước đó và tại sigma đặt độ lệch chuẩn tính trước đó.
  4. sau khi áp dụng giai đoạn 3, bạn sẽ nhận được hai giá trị xác suất cho mỗi pixel cho hai lớp, chỉ cần chọn lớp có xác suất cao hơn.

Cách tiếp cận 3:

Tiếp cận 3 là phức tạp hơn trên hai: bạn có thể sử dụng một số cấu trúc hoạt động dựa vào phân khúc ra cát loại kết cấu, nhưng để áp dụng kết cấu phương pháp dựa tôi sẽ đề nghị phân loại giám sát hơn không giám sát (như k-means). tính năng kết cấu khác nhau mà bạn có thể sử dụng là:

cơ bản:

  1. Phạm vi của các mức xám trong một khu dân cư được xác định.
  2. ý nghĩa địa phương và phương sai hoặc entropy.
  3. Ma trận đồng mức xám (GLCM).

nâng cao:

  1. Patterns Binary địa phương.
  2. Biến đổi Wavelet.
  3. Biến đổi Gabor. v.v.

PS: Theo tôi, bạn nên cố gắng tiếp cận 1 và 2. nó có thể giải quyết nhiều công việc. :)

2

Để có kết quả tốt hơn bạn nên áp dụng nhiều thuật toán. Hướng dẫn OpenCV luôn tập trung vào một tính năng của OpenCV. Các ứng dụng CV thực sự nên sử dụng càng nhiều càng tốt các kỹ thuật và thuật toán có thể.

Tôi đã sử dụng để phát hiện các tế bào sinh học trong hình ảnh ồn ào và tôi đã đạt được kết quả rất tốt áp dụng một số thông tin theo ngữ cảnh:

  • Dự kiến ​​kích thước của các tế bào
  • Thực tế là tất cả các ô có kích thước tương tự
  • Số lượng dự kiến ​​của các tế bào Vì vậy, tôi đã thay đổi nhiều thông số và cố gắng phát hiện những gì tôi đang tìm kiếm.

Nếu sử dụng phát hiện cạnh, cát sẽ cho hình dạng khá ngẫu nhiên. Cố gắng thay đổi các tham số canny và phát hiện các đường, rects, circle, ets. - bất kỳ hình dạng nào có thể xảy ra đối với rác. Hãy nhớ vị trí của các đối tượng được phát hiện cho từng tham số-thiết lập và tại và ưu tiên cho các vị trí đó (các khu vực) nơi các hình dạng được phát hiện nhiều lần nhất.

Sử dụng tách màu. Các đỉnh trong biểu đồ màu có thể là các gợi ý cho rác, vì sự phân bố của các màu cát nên được thậm chí nhiều hơn.

Đối với một số đối tượng nhỏ, thường xuất hiện như điếu thuốc lá, bạn có thể áp dụng object matching.

P.S: Ứng dụng thú vị! Jus ra khỏi sự tò mò, là yoou sẽ quét các bãi biển với một quadcopter?

+0

bạn có bất kỳ tài liệu tham khảo nào khác về cách kết hợp hệ thống nhiều thiết bị dò tìm không? – Micka

+1

Không. Một số phần tôi đã mã hóa cứng, đối với một số phần tôi đã sử dụng SVM. Lúc đầu, tôi đã dành nhiều thời gian tìm kiếm "giải pháp thích hợp để sử dụng" trong OpenCV để "không phát minh lại bánh xe". Cuối cùng tôi đã sử dụng một số kết hợp mã của tôi là OpenCV. Sau đó, một chuyên gia OpenCV đã xác nhận với tôi, không phải để đưa OpenCV quá theo nghĩa đen. Họ không thể nghĩ về tất cả các trường hợp sử dụng. Tôi thậm chí đã tự triển khai lựa chọn tính năng tự động để có thể xem xét thông tin theo ngữ cảnh hoặc miền. –

0

Nếu bạn muốn phát hiện các đối tượng trên nền đồng nhất như vậy, bạn nên bắt đầu bằng cách phát hiện màu chính trong hình ảnh. Như thế bạn sẽ phát hiện tất cả cát, và các đối tượng sẽ nằm trong các phần còn lại. Bạn có thể xem các bài báo do Arnaud LeTrotter và Ludovic Llucia xuất bản, cả hai đều sử dụng loại "phát hiện màu chính" này.

+1

Bối cảnh không phải là đồng phục! Cát có thể khô hoặc ướt, màu cát có thể khác nhau. Các shaddows, thời gian trong ngày sẽ thay đổi màu sắc đáng kể, vv –

+0

Nó phải được thống nhất cho một hình ảnh nhất định! Thuật toán họ sử dụng được tính trên mỗi hình ảnh, không phải một lần cho tất cả. – FiReTiTi

Các vấn đề liên quan