# In[011]: from PIL import Image import numpy as np import csv
deffitler_two_value_black(image, filterValue): """ 筛选二值化后的差图 """ im = image data = im.getdata() w, h = im.size black_point = 0
# 省去外轮廓,减少非去除噪点干扰 for x in range(10, w - 1): for y in range(15, h - 1): pixelData = im.getpixel((x, y)) if (pixelData < filterValue): black_point += 1 # im.show() #print("像素占比:", black_point * 100 / (w * h), "%") return black_point * 100 / (w * h)
defanlyze(): print("start to write ") header = ["captcha","label","black_point_count"] with open("./去噪后验证码像素比例分析.csv","w",newline="") as csvFile: csvWriter = csv.writer(csvFile) csvWriter.writerow(header) for i in range(1, 5001): imagePath = "./testCompResult/" + str(i) + ".jpg" im = Image.open(imagePath) point = fitler_two_value_black(im, 1) listg = [str(i) + ".jpg", "label_None", str(point)] csvWriter.writerow(listg)
csvFile.close() print("finish!")
anlyze()
(三). 数据可视化分析
离散分布图中,明显可见检测的黑色点所占百分比有部分图像的 point 值超过了平均值7.6,此即为黑图,小于 5 的为残缺较为严重的图像。
四. 新处理思想探索与效果(较为显著)
(一). 使用 OpenCV 灰度灰度图再进行二值化降噪
此步有利于避免前一步的黑图。
但也引入了新的问题,就是对灰度图的二值化引入了很多噪点:
单张图像放大展示:
对该图再去噪又会破坏文字的完整性,且效果比较差,减小阈值又会造成所需特征缺失,如下图:
(二). 基于 openCV 加入高斯滤波
(三). 对加入滤波后的图像再次进行二值化并去噪
至此,降噪基本达到效果,背景噪点数量极少,字符显示极为清晰透亮,白白净净。
五. 残缺图的产生与验证增强
经过前一步的处理后,虽说去噪效果极好,但我们发现部分图像的字符有所残缺。
经过多次认证测试,摸索出的新办法思想如下:
以上流程部分内容代表去噪算法。
以上为图像增强测试主要过程及效果,下面对图像集进行批量处理 :
其中测试用到的增强对比度的算法为伽马算法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# In[011]: from PIL import Image import numpy as np import cv2
defgammaChange(imagePath, gamma_value): """ 基于opencv的伽马变换,对图像对比度处理,但是保存后的图像貌似不太对劲,处理黑图 :param imagePath:原始文件路径 :return:numpy类型的 opencv 封装类型,需要使用cv2.imshow(),imwrite()操作 """ img = cv2.imread(imagePath, cv2.IMREAD_GRAYSCALE) # 图像归一化 fi = img / 1 # 伽马变换 out = np.power(fi, gamma_value) return out