由于文本和背景似乎有明显的阴影,因此在这里应使用颜色阈值。想法是将图像转换为HSV格式,然后使用上下阈值生成二进制分割的掩码,然后按位生成文本并提取文本。这是使用Python
OpenCV的实现
使用这个上下阈值,我们得到这个面具
lower = np.array([0, 120, 0])upper = np.array([179, 255, 255])
然后我们按位处理原始图像
最后我们阈值得到二进制图像,前景文本为黑色,背景为白色
import numpy as npimport cv2# Color thresholdimage = cv2.imread('1.png')original = image.copy()hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)lower = np.array([0, 120, 0])upper = np.array([179, 255, 255])mask = cv2.inRange(hsv, lower, upper)result = cv2.bitwise_and(original,original,mask=mask)result[mask==0] = (255,255,255)# Make text black and foreground whiteresult = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)result = cv2.threshold(result, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]cv2.imshow('mask', mask)cv2.imshow('result', result)cv2.waitKey()您可以使用此HSV颜色阈值脚本来确定上下阈值
import cv2import sysimport numpy as npdef nothing(x): pass# Load in imageimage = cv2.imread('1.png')# Create a windowcv2.namedWindow('image')# create trackbars for color changecv2.createTrackbar('HMin','image',0,179,nothing) # Hue is from 0-179 for Opencvcv2.createTrackbar('SMin','image',0,255,nothing)cv2.createTrackbar('VMin','image',0,255,nothing)cv2.createTrackbar('HMax','image',0,179,nothing)cv2.createTrackbar('SMax','image',0,255,nothing)cv2.createTrackbar('VMax','image',0,255,nothing)# Set default value for MAX HSV trackbars.cv2.setTrackbarPos('HMax', 'image', 179)cv2.setTrackbarPos('SMax', 'image', 255)cv2.setTrackbarPos('VMax', 'image', 255)# Initialize to check if HSV min/max value changeshMin = sMin = vMin = hMax = sMax = vMax = 0phMin = psMin = pvMin = phMax = psMax = pvMax = 0output = imagewait_time = 33while(1): # get current positions of all trackbars hMin = cv2.getTrackbarPos('HMin','image') sMin = cv2.getTrackbarPos('SMin','image') vMin = cv2.getTrackbarPos('VMin','image') hMax = cv2.getTrackbarPos('HMax','image') sMax = cv2.getTrackbarPos('SMax','image') vMax = cv2.getTrackbarPos('VMax','image') # Set minimum and max HSV values to display lower = np.array([hMin, sMin, vMin]) upper = np.array([hMax, sMax, vMax]) # Create HSV Image and threshold into a range. hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, lower, upper) output = cv2.bitwise_and(image,image, mask= mask) # Print if there is a change in HSV value if( (phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ): print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax)) phMin = hMin psMin = sMin pvMin = vMin phMax = hMax psMax = sMax pvMax = vMax # Display output image cv2.imshow('image',output) # Wait longer to prevent freeze for videos. if cv2.waitKey(wait_time) & 0xFF == ord('q'): breakcv2.destroyAllWindows()


