验证码的去噪

一、目的:

针对现在网站的验证码存在许多噪声, 所以计算机在识别时会出现一些错误, 所有就要使用一些方法来将一些干扰线,也就是“噪音” 进行去噪,这儿使用opencv(cv2),和 opencv来实现验证码的去噪.

二、主要步骤:
  • 0、导包
import cv2
import numpy as np
  • 1、读取图片,图片的灰度化处理
img = cv2.imread('./captcha.jpg')
# 灰度化方法1
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 灰度化方法2
img2 = img.min(axis=2)
# 灰度化方法3
img3 = img.mean(axis=2).astype(np.unit8)
# 灰度化方法4:根据 三原色 红绿蓝的权重, 0.299:0.587:0.114
# opencv 返回的是 蓝绿红
w = np.array([0.114, 0.587, 0.299])
img4 = img.dot(w).astype(np.uint8)


# cv2.imshow('gray', gray)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# 以上方法人选一种

opencvqu去干扰线python opencv图像去噪_去噪

  • 2、二值化处理
# 二值化处理,由于图片的颜色是由0~255构成, 
# 所以要将图片中的颜色,全部变为极值 0/255
# 0,0,0 是黑色,值越大 颜色越浅
# gray是灰度化的图片
# 参数2(240)是阈值, 240意味着大于240变成255,小于240变成0, 
# 如果二值化时验证码有显示不全,应将阈值调高,尽量变黑
t, gray2 = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY)
# 返回结果: array([  0, 255], dtype=uint8)
# cv2.imshow('gray', gray2)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

opencvqu去干扰线python opencv图像去噪_去噪_02

  • 3、8领域(距离最近的8个点)过滤
# 由于背景的一些噪声时相对独立的,所以进行8领域点过滤
# k是过滤条件
def remove_noise(img, k=4):
	img2 = img 
	w,h = img2.shape
	
	def get_neighbors(img3, r, c):
		count = 0
		for i in [r-1, r, r+1]:
			for j in [c-1, c, c+1]:
				if img3[i,j] > 220:   #纯白色
					counr += 1
		return count
	
	for x in range(w):
		for y in range(h):
			if x==0 or y==0 or x==w-1 or y==h-1:
				img2[x,y] = 255
			else:
				n = get_neighbors(img2,x,y) # 得到邻居的数量,纯白色的邻居
				if n>k:
					img2[x,y] = 255
	return img2

opencvqu去干扰线python opencv图像去噪_opencvqu去干扰线python_03

  • 4、形态学的处理,侵蚀和膨胀
result = remove_noise(gray2)
# 定义卷积核 kernel , 正方形, 
# 规模: 3*3 5*5 9*9  卷积操作
# 神经网络就是卷积运算而来的
kernel = np.random.randn(5,5)
result = cv2.morphologyEx(result, cv2.MORPH_OPEN, kernel)
cv2.imgshow('8neighbors',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencvqu去干扰线python opencv图像去噪_验证码_04

三、补充,morphologyEx() 的具体实现方法, 腐蚀和膨胀
  1. cv2.erode() 和 cv2.dilate()

opencvqu去干扰线python opencv图像去噪_灰度_05

# 将一些线进行腐蚀,变细操作
image = cv2.imread('./fushi.png')
# 卷积核
kernel = np.ones(shape=(5,5), dtype=np.uint8)
# iteration 腐蚀的次数,越大,腐蚀越多
image= cv2.erode(image, kernel, iterations = 3)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencvqu去干扰线python opencv图像去噪_opencvqu去干扰线python_06

# 膨胀,变粗
image_dilate= cv2.dilate(image, kernel, iterations=3)
cv2.imshow('image_dilate', image_dilate)
cv2.waitKey(0)
cv2.destroyAllWindow()

opencvqu去干扰线python opencv图像去噪_去噪_07

2、morphologyEx() 形态学的开运算,可以直接实现腐蚀和膨胀

# 调用方法,可直接实现 腐蚀和膨胀
image = cv2.imread('./fushi.png')
kernel = np.ones(shape=(5,5), dtype=np.uint8)
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow('show', opening)
cv2.waitKey(0)
cv2.destroyWindows()

opencvqu去干扰线python opencv图像去噪_灰度_08

四、总结

使用以上步骤,可以实现验证码图片的去重,以及其他一些图片的去噪操作,实现方便计算机识别验证码的操作……


望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。