本人自己用的简单暴力的去噪思路:
把图片分成众多小矩形,每一个小矩形进行判断白点(图片已经二值化处理),如果该矩形内的白点大于一个值(这个值可以根据你取得矩形的大小进行酌情处理)。小于这个值则这一块的值变成0(黑色)。
过程:
我有如下部分代码1
2
3
4.... # 图片已经打开,保存在img变量里面
pixel = img.load()
print(pixel[x,y]) # 打印出坐标为(x,y)的像素值
利用PIL库的im.load方法(im.load方法算是PIL库里面处理像素问题比较快的),可以得到一个图片每个像素的像素值,实质上是一个二维队列(就像C语言里面的二维数组),注意:如果你将图片二值化(图片convert(‘1’),)或者convert(‘1’),就只会显示一个数字。例如:1
2
3
4img2 = img.convert('L')
pixel2 = img2.load()
print(pixel2[x,y]) # 显示一个数字,该数字位于0~255之间,每个像素用8bit表示
# 如果前面是img2 = img.convert('1')二值化后,结果只可能是0(黑),或者255(白0
在RGB模式或者RGBA模式下,打印一个像素的值,结果会显示一个元祖,形式为(R值,G值,B值)或者(R值,G值,B值,A值)。
本人的思路是,先图片二值化,利用2个for循环遍历整个图片大小的像素值,将图片切成一个个小矩形,判断每个矩形内白点,然后设定一个值(这个值根据你切的大小以及像素多少自己定义个数字就可以了),矩形是越小越好,越小虽然会增加计算机的计算时间,但可以使图片去噪效率更高。
我这里上了我那次辅助的去噪代码(部分)
图片是480*360分辨率。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15for xx in range(40): # 横着12 竖着9 运行40次 0代表黑色,255代表白色,去噪点
for yy in range(40): # 每一个24*18
x = xx * 12
y = yy * 9
count = 0
for i in range(0, 12):
for j in range(0, 9):
if (array[i + x, j + y] == 255):
count = count + 1
if count <= 10: # 去黑点的地方,也就是该区域内白点小于等于10,判断是噪点,则像素值全部赋值为0,也就是这区域全黑。
for i in range(0, 12):
for j in range(0, 9):
array[i + x, j + y] = 0
else: # 留白的地方,点击中心位置
xy.append([x + 12, y + 9]) # 坐标是基于图像,要基于游戏