本文要點在于Python內置函數和擴展庫pillow的用法。圖像空域融合的主要思路是:把所有含有隨機噪點的臨時圖像中對應位置像素值的平均值作為最終像素值,生成結果圖像,這樣可以很大程度上消除隨機噪點。
python必背入門代碼,from random import randint
from PIL import Image
python數據降噪的處理方法,#根據原始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幅圖像進行融合以后得到的結果圖像:
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态