我用 opencv-python 在我的照片中检测到了眩光点。我怎样才能删除它们?
I have detected the glare spots in my photo with opencv-python. How can I remove them?
下面的代码,我已经使用检测image.I中的眩光斑点进行了一系列的腐蚀和膨胀去除,并对阈值进行了连通分量分析。我怎样才能删除它们 openc-python?
path = "desire image path"
image = cv2.imread(path)
gray = cv2.cvtColor( image, cv2.COLOR_BGR2GRAY )
blurred = cv2.GaussianBlur( gray, (11, 11), 0 )
# threshold the image to reveal light regions in the
# blurred image
thresh = cv2.threshold( blurred, 200, 255, cv2.THRESH_BINARY )[1]
# perform a series of erosions and dilations to remove
# any small blobs of noise from the thresholded image
thresh = cv2.erode( thresh, None, iterations=2 )
thresh = cv2.dilate( thresh, None, iterations=4 )
# perform a connected component analysis on the thresholded
# image, then initialize a mask to store only the "large"
# components
labels = measure.label( thresh, neighbors=8, background=0 )
mask = np.zeros( thresh.shape, dtype="uint8" )
# loop over the unique components
for label in np.unique( labels ):
# if this is the background label, ignore it
if label == 0:
continue
# otherwise, construct the label mask and count the
# number of pixels
labelMask = np.zeros( thresh.shape, dtype="uint8" )
labelMask[labels == label] = 255
numPixels = cv2.countNonZero( labelMask )
# if the number of pixels in the component is sufficiently
# large, then add it to our mask of "large blobs"
if numPixels > 300:
mask = cv2.add( mask, labelMask )
# find the contours in the mask, then sort them from left to
# right
cnts = cv2.findContours( mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE )
cnts = imutils.grab_contours( cnts )
cnts = contours.sort_contours( cnts )[0]
# loop over the contours
for (i, c) in enumerate( cnts ):
# draw the bright spot on the image
(x, y, w, h) = cv2.boundingRect( c )
((cX, cY), radius) = cv2.minEnclosingCircle( c )
cv2.circle( image, (int( cX ), int( cY )), int( radius ),
(0, 0, 255), 3 )
cv2.putText( image, "#{}".format( i + 1 ), (x, y - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2 )
# image = remove_glare( image, x, y )
# show the output image
cv2.imshow( "Image", image )
cv2.imwrite("spots_detected.jpg",image)
cv2.waitKey( 0 )
OpenCV 库附带两种修复算法:
cv2.INPAINT_TELEA
一种基于快速行进方法的图像修复技术(Telea, 2004)
cv2.INPAINT_NS
Navier-stokes、流体动力学、图像和视频修复 (Bertalmío 等人,2001 年)
使用斑点作为蒙版创建大小相同的二值图像。然后运行cv2.inpaint(image, mask, radius, method)
看看结果。
下面的代码,我已经使用检测image.I中的眩光斑点进行了一系列的腐蚀和膨胀去除,并对阈值进行了连通分量分析。我怎样才能删除它们 openc-python?
path = "desire image path"
image = cv2.imread(path)
gray = cv2.cvtColor( image, cv2.COLOR_BGR2GRAY )
blurred = cv2.GaussianBlur( gray, (11, 11), 0 )
# threshold the image to reveal light regions in the
# blurred image
thresh = cv2.threshold( blurred, 200, 255, cv2.THRESH_BINARY )[1]
# perform a series of erosions and dilations to remove
# any small blobs of noise from the thresholded image
thresh = cv2.erode( thresh, None, iterations=2 )
thresh = cv2.dilate( thresh, None, iterations=4 )
# perform a connected component analysis on the thresholded
# image, then initialize a mask to store only the "large"
# components
labels = measure.label( thresh, neighbors=8, background=0 )
mask = np.zeros( thresh.shape, dtype="uint8" )
# loop over the unique components
for label in np.unique( labels ):
# if this is the background label, ignore it
if label == 0:
continue
# otherwise, construct the label mask and count the
# number of pixels
labelMask = np.zeros( thresh.shape, dtype="uint8" )
labelMask[labels == label] = 255
numPixels = cv2.countNonZero( labelMask )
# if the number of pixels in the component is sufficiently
# large, then add it to our mask of "large blobs"
if numPixels > 300:
mask = cv2.add( mask, labelMask )
# find the contours in the mask, then sort them from left to
# right
cnts = cv2.findContours( mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE )
cnts = imutils.grab_contours( cnts )
cnts = contours.sort_contours( cnts )[0]
# loop over the contours
for (i, c) in enumerate( cnts ):
# draw the bright spot on the image
(x, y, w, h) = cv2.boundingRect( c )
((cX, cY), radius) = cv2.minEnclosingCircle( c )
cv2.circle( image, (int( cX ), int( cY )), int( radius ),
(0, 0, 255), 3 )
cv2.putText( image, "#{}".format( i + 1 ), (x, y - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2 )
# image = remove_glare( image, x, y )
# show the output image
cv2.imshow( "Image", image )
cv2.imwrite("spots_detected.jpg",image)
cv2.waitKey( 0 )
OpenCV 库附带两种修复算法:
cv2.INPAINT_TELEA
一种基于快速行进方法的图像修复技术(Telea, 2004)cv2.INPAINT_NS
Navier-stokes、流体动力学、图像和视频修复 (Bertalmío 等人,2001 年)
使用斑点作为蒙版创建大小相同的二值图像。然后运行cv2.inpaint(image, mask, radius, method)
看看结果。