. 感谢海涛老师,给我新的视角,这部分代码有些变量命名不是很好
.
.
.
.
.
.
.
验证码图片
彩色图片是由 3个二维矩阵来表示的
from PIL import Image
import numpy as np
imag = Image.open(path)
data = np.array(imag)
print(data.shape)
通过以上代码,即可看到彩色图片矩阵的形状 (25, 80, 3)
灰度化方法
im = Image.open(path).convert('L')
调用 灰度化方法 压缩为一个二维矩阵(25, 80)
灰度化后的矩阵值为:[203 200 ... 200 193] #80行25列
.
.
.
[201 197 ... 205 204]
将灰度值大于110灰度值认为是白色,小于110灰度值认为是黑色
二值化
W,H = im.size
for w in range(W):
for h in range(H):
pix =im.getpixel((w, h))
if pix > 110:
pix = 255
im.putpixel((w, h), pix)
else:
pix = 0
im.putpixel((w, h), pix)
#im.show()
得到二值化图片(只有黑白颜色)
如果遇到黑色的像素,判断他的周边的像素(九宫格)是黑色像素多还是白色像素多,如果该像素周边白色像素多,就认为该像素是白色的
总体代码如下
from PIL import Image
import numpy as np
def open_img():
path='demo.png'
# 灰度化
im = Image.open(path).convert('L')
W,H = im.size
#二值化
for w in range(W):
for h in range(H):
pix =im.getpixel((w, h))
if pix > 110:
pix = 255
im.putpixel((w, h), pix)
else:
pix = 0
im.putpixel((w, h), pix)
#得到九宫格
neighbor=None
for w in range(W):
for h in range(H):
#只有黑色才求它的九宫格
if(im.getpixel((w,h))==0):
neighbor=get_neighbor(w,h,W,H)
pixel=[]
for nei in neighbor:
# 根据邻居位置得到二度值 255 为白色 0 为黑色
pixel.append(im.getpixel(nei))
#统计黑色比例
num_0=pixel.count(0)
#print(num_0/pixel.__len__())
if (num_0/pixel.__len__())>0.25:
im.putpixel((w,h),0)
else:
im.putpixel((w,h),255)
im.show()
def get_neighbor(W,H,WIDTH,HEIGH):
neighbor=[]
for w in range(W-1,W+2):
for h in range(H-1,H+2):
#边界判断
if( w>=0 and w<WIDTH and h>=0 and h<HEIGH):
neighbor.append((w,h))
else:
continue
return neighbor
if __name__ == '__main__':
open_img()
#get_neighbor(6,6,50,50)