基于OpenCV的水中水滴检测:光斑误检问题及优化需求
水中水滴的OpenCV检测问题
我尝试使用OpenCV检测水中的水滴,初始采用边缘检测方案,但图像中的光斑会被误识别为水滴。待检测的水滴特征为白色区域外围环绕深色层。
我的实现代码如下:
import cv2 import numpy as np def unsharp_mask(img, blur_size = (5,5), imgWeight = 1.5, gaussianWeight = -0.5): gaussian = cv2.GaussianBlur(img, (5,5), 0) return cv2.addWeighted(img, imgWeight, gaussian, gaussianWeight, 0) def clahe(img, clip_limit = 2.0): clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=(5,5)) return clahe.apply(img) def get_sobel(img, size = -1): sobelx64f = cv2.Sobel(img,cv2.CV_64F,2,0,size) abs_sobel64f = np.absolute(sobelx64f) return np.uint8(abs_sobel64f) img = cv2.imread("img_brightened.jpg") # save color copy for visualizing imgc = img.copy() # resize image to make the analytics easier (a form of filtering) resize_times = 1.5 img = cv2.resize(img, None, fx = 1 / resize_times, fy = 1 / resize_times) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow("Input", img) # use sobel operator to evaluate high frequencies sobel = get_sobel(img) # experimentally calculated function - needs refining clip_limit = (-2.556) * np.sum(sobel)/(img.shape[0] * img.shape[1]) + 26.557 # don't apply clahe if there is enough high freq to find blobs if(clip_limit < 1.0): clip_limit = 0.1 # limit clahe if there's not enough details - needs more tests if(clip_limit > 8.0): clip_limit = 8 # apply clahe and unsharp mask to improve high frequencies as much as possible img = clahe(img, clip_limit) img = unsharp_mask(img) # filter the image to ensure edge continuity and perform Canny img_blurred = (cv2.GaussianBlur(img, (2*2+1,2*2+1), 0)) canny = cv2.Canny(img_blurred, 100, 255) cv2.imshow("Output", canny) cv2.waitKey(0)
当前检测结果如下:
内容的提问来源于stack exchange,提问作者Rachid Ben abdelmalek
相关产品推荐
相关产品推荐

