一、可视化二值化
在图片预处理的过程中,我们常常需要二值化图片,但是二值化值一个个去试,比较麻烦。下面通过trackbar来可视化连续二值化图片的情景。代码如下:
import cv2
def threshTrackbar(img):
"""
使二值化图片过程可视化
:param img: 待二值化的图片
:return thr_v,Shading:阈值,大于阈值时替代的值
"""
# 确定图片是否是彩色,如果是则灰度化
if len(img.shape) == 3:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
def nothing(x):
pass
img_copy = img
# 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)
原图:
二值化过程可视界面(可以通过红色剪头拖拽改变二值化的值,以便找到最佳的二值化值):
二、可视化颜色分割
BGR颜色空间转HSV,然后分割。效果如下。
import cv2
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("中键点击")
def threshTrackbar(hsv):
"""
:param img: 待二值化的图片
:return thr_v,Shading:阈值,大于阈值时替代的值
"""
def nothing(x):
pass
hsv_copy = hsv
# Create a window
cv2.namedWindow('image')
cv2.setMouseCallback('image', OnMouseAction)
# create trackbars for color change
cv2.createTrackbar('H1', 'image', 0, 180, nothing)
cv2.createTrackbar('H2', 'image', 180, 180, nothing)
cv2.createTrackbar('S1', 'image', 0, 255, nothing)
cv2.createTrackbar('S2', 'image', 255, 255, nothing)
cv2.createTrackbar('V1', 'image', 0, 255, nothing)
cv2.createTrackbar('V2', 'image', 255, 255, nothing)
while (True):
cv2.imshow('image', hsv)
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
H1 = cv2.getTrackbarPos('H1', 'image')
H2 = cv2.getTrackbarPos('H2', 'image')
S1 = cv2.getTrackbarPos('S1', 'image')
S2 = cv2.getTrackbarPos('S2', 'image')
V1 = cv2.getTrackbarPos('V1', 'image')
V2 = cv2.getTrackbarPos('V2', 'image')
hsv = cv2.inRange(hsv_copy, (H1, S1, V1), (H2, S2, V2))
cv2.destroyAllWindows()
return [H1, S1, V1], [H2, S2, V2]
imgPath = "./images_jiangling/001_000002.png"
if __name__ == "__main__":
img = cv2.imread(imgPath)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
cv2.waitKey(0)
print(threshTrackbar(hsv))
效果图: