在图片预处理的过程中,我们常常需要二值化图片,但是二值化值一个个去试,比较麻烦。下面通过trackbar来可视化连续二值化图片的情景。代码如下:
import cv2
def threshTrackbar(img):
"""
使二值化图片过程可视化
:param img: 待二值化的灰度图
:return thr_v,Shading:阈值,大于阈值时替代的值
"""
img_copy = img
def nothing(x):
pass
# Create a window
cv2.namedWindow('image')
cv2.setMouseCallback('image', OnMouseAction)
# create trackbars for color change
cv2.createTrackbar('thr', 'image', 121, 255, nothing)
cv2.createTrackbar('Shading', 'image', 255, 255, nothing)
while (True):
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
# 通过关闭窗口的右上角关闭
if cv2.getWindowProperty('image', cv2.WND_PROP_AUTOSIZE) < 1:
break
# 通过按键盘的ESC退出
if k == 27:
break
# get current positions of four trackbars
thr_v = cv2.getTrackbarPos('thr', 'image')
shading = cv2.getTrackbarPos('Shading', 'image')
_, img = cv2.threshold(img_copy, thr_v, shading, cv2.THRESH_BINARY)
cv2.destroyAllWindows()
return thr_v, shading
def OnMouseAction(event,x,y,flags,param):
"""
鼠标的回调函数,处理鼠标事件
:param event:
:param x:
:param y:
:param flags:
:param param:
:return:
"""
if event == cv2.EVENT_LBUTTONDOWN:
print("左键点击")
elif event==cv2.EVENT_RBUTTONDOWN :
print("右键点击")
elif flags==cv2.EVENT_FLAG_LBUTTON:
print("左鍵拖曳")
elif event==cv2.EVENT_MBUTTONDOWN :
print("中键点击")
if __name__ == '__main__':
img = cv2.imread('1.jpg')
#cv2.imshow("src", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#cv2.imshow("gray", gray)
thr, shading = threshTrackbar(gray)
print(thr, shading)
_, thr_img = cv2.threshold(gray, 121, 255, cv2.THRESH_BINARY)
原图:
二值化过程可视界面(可以通过红色剪头拖拽改变二值化的值,以便找到最佳的二值化值):
来源:https://blog.csdn.net/qq_31112205/article/details/100827062