前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python使用空域融合技术进行图像去噪

Python使用空域融合技术进行图像去噪

作者头像
Python小屋屋主
发布2018-04-16 15:45:36
1.5K0
发布2018-04-16 15:45:36
举报
文章被收录于专栏:Python小屋Python小屋Python小屋

本文要点在于Python内置函数和扩展库pillow的用法。图像空域融合的主要思路是:把所有含有随机噪点的临时图像中对应位置像素值的平均值作为最终像素值,生成结果图像,这样可以很大程度上消除随机噪点。

from random import randint

from PIL import Image

#根据原始24位色BMP图像文件,生成指定数量含有随机噪点的临时图像

def addNoise(fileName, num):

#这里假设原始图像为BMP文件

if not fileName.endswith('.bmp'):

print('Must be bmp image')

return

#生成num个含有随机噪点的图像文件

for i in range(num):

#打开原始图像

im = Image.open(fileName)

#获取图像尺寸

width, height = im.size

#每个结果图像中含有的噪点数量可能会不一样

n = randint(1, 20)

for j in range(n):

#随机位置

w = randint(0, width-1)

h = randint(0, height-1)

#修改随机位置的像素值

im.putpixel((w,h), (0,0,0))

#保存结果图像

im.save(fileName[:-4]+'_'+str(i+1)+'.bmp')

#根据多个含有随机噪点的图像,对应位置像素计算平均值,生成结果图像

def mergeOne(fileName, num):

if not fileName.endswith('.bmp'):

print('Must be bmp image')

return

#列表推导式,打开上面的函数生成的所有含有噪点的图像

ims = [Image.open(fileName[:-4]+'_'+str(i+1)+'.bmp') for i in range(num)]

#创建新图像

im = Image.new('RGB', ims[0].size, (255,255,255))

for w in range(im.size[0]):

for h in range(im.size[1]):

#生成器推导式,计算所有临时图像中对应位置上像素值的平均值

r = sum((tempIm.getpixel((w,h))[0] for tempIm in ims)) // num

g = sum((tempIm.getpixel((w,h))[1] for tempIm in ims)) // num

b = sum((tempIm.getpixel((w,h))[2] for tempIm in ims)) // num

#写入结果图像中对应位置

im.putpixel((w,h), (r,g,b))

#保存最终结果图像

im.save(fileName[:-4]+'_result.bmp')

#对比合并后的图像和原始图像之间的相似度

def compare(fileName):

im1 = Image.open(fileName)

im2 = Image.open(fileName[:-4]+'_result.bmp')

width, height = im1.size

#图像中的像素总数量

total = width * height

#两个图像中对应位置像素值相似的次数

right = 0

#判断是否相似的阈值

expectedRatio = 0.05

for w in range(width):

for h in range(height):

#获取两个图像同一位置上的像素值

c1 = im1.getpixel((w,h))

c2 = im2.getpixel((w,h))

#生成器推导式,判断两个像素值各分量之差的绝对值是否小于阈值

similar = (abs(i-j)<255*expectedRatio for i,j in zip(c1,c2))

#如果每个分量都小于阈值,相似像素个数加1

if all(similar):

right += 1

return (total, right)

if __name__ == '__main__':

#生成4个临时图像,然后进行融合,并对比融合后的图像与原始图像的相似度

addNoise('test.bmp', 4)

mergeOne('test.bmp', 4)

result = compare('test.bmp')

print('Total number of pixels:{0[0]},right number:{0[1]}'.format(result))

测试用的原图:

使用本程序生成的4幅含有随机噪点的图像:

使用本程序对4幅图像进行融合以后得到的结果图像:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档