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:
Canny phát hiện cạnh mà không cần bất cứ xử lý hình ảnh:
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:
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()
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. –
Được rồi, tôi đã bỏ phiếu. –
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