import matplotlib.pyplot as plt
import sys, os
from PIL import Image, ImageDraw
# 二值判断,如果确认是噪声,用改点的上面一个点的灰度进行替换
# 该函数也可以改成RGB判断的,具体看需求如何
def getPixel(image, x, y, G, N):
L = image.getpixel((x, y))
if L > G:
L = True
else:
L = False
nearDots = 0
if L == (image.getpixel((x - 1, y - 1)) > G):
nearDots += 1
if L == (image.getpixel((x - 1, y)) > G):
nearDots += 1
if L == (image.getpixel((x - 1, y + 1)) > G):
nearDots += 1
if L == (image.getpixel((x, y - 1)) > G):
nearDots += 1
if L == (image.getpixel((x, y + 1)) > G):
nearDots += 1
if L == (image.getpixel((x + 1, y - 1)) > G):
nearDots += 1
if L == (image.getpixel((x + 1, y)) > G):
nearDots += 1
if L == (image.getpixel((x + 1, y + 1)) > G):
nearDots += 1
if nearDots < N:
return image.getpixel((x, y - 1))
else:
return None
# 降噪
# 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点
# G: Integer 图像二值化阀值
# N: Integer 降噪率 0 <N <8
# Z: Integer 降噪次数
# 输出
# 0:降噪成功
# 1:降噪失败
def clearNoise(image, G, N, Z):
draw = ImageDraw.Draw(image)
for i in range(0, Z):
for x in range(1, image.size[0] - 1):
for y in range(1, image.size[1] - 1):
color = getPixel(image, x, y, G, N)
if color != None:
draw.point((x, y), color)
# 测试代码
def main():
# 打开图片
img = Image.open(r"F:\主题一:遥感图像场景分类\val\val\冰岛\ice-land_00013.jpg")
# 将图片转换成灰度图片
image = img.convert("L")
# 去噪,G = 50,N = 3,Z = 8
clearNoise(image, 50, 3, 8)
plt.subplot(121), plt.imshow(img)
plt.subplot(122), plt.imshow(image)
plt.show()
# 保存图片
# image.save(r'F:\3.jpg')
if __name__ == '__main__':
main()
结果