• 大小: 7KB
    文件类型: .py
    金币: 2
    下载: 1 次
    发布日期: 2021-08-06
  • 语言: Python
  • 标签: 图像处理  python  

资源简介

实现两张图像融合,共两种方式,拉普拉斯金字塔融合,小波金字塔融合

资源截图

代码片段和文件信息

# -*- coding: utf-8 -*-
“““
Created on Wed Oct 31 15:56:33 2018
“““

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
from math import log
from PIL import Image
import datetime
import pywt
 
# 以下强行用Python宏定义变量
halfWindowSize=9
src1_path = ‘F:\\python\\1.jpg‘
src2_path = ‘F:\\python\\2.jpg‘
 
‘‘‘
来自敬忠良,肖刚,李振华《图像融合——理论与分析》P85:基于像素清晰度的融合规则
1,用Laplace金字塔或者是小波变换,将图像分解成高频部分和低频部分两个图像矩阵
2,以某个像素点为中心开窗,该像素点的清晰度定义为窗口所有点((高频/低频)**2).sum()
3,目前感觉主要的问题在于低频
4,高频取清晰度图像中较大的那个图的高频图像像素点
5,算法优化后速度由原来的2min.44s.变成9s.305ms.
补充:书上建议开窗大小10*10,DWT取3层,Laplace金字塔取2层
‘‘‘
 
def imgOpen(img_src1img_src2):
    apple=Image.open(img_src1).convert(‘L‘)
    orange=Image.open(img_src2).convert(‘L‘)
    appleArray=np.array(apple)
    orangeArray=np.array(orange)
    return appleArrayorangeArray
 
# 严格的变换尺寸
def _sameSize(img_stdimg_cvt):
    xy=img_std.shape
    pic_cvt=Image.fromarray(img_cvt)
    pic_cvt.resize((xy))
    return np.array(pic_cvt)
 
# 小波变换的层数不能太高,Image模块的resize不能变换太小的矩阵,不相同大小的矩阵在计算对比度时会数组越界
def getWaveImg(appleorange):
    appleWave=pywt.wavedec2(apple‘haar‘level=2)
    orangeWave=pywt.wavedec2(orange‘haar‘level=2)
    lowApple=appleWave[0];lowOrange=orangeWave[0]
    lowAppleWidthlowAppleHeight=lowApple.shape
    lowOrangeWidthlowOrangeWidth=lowOrange.shape
    
    # 以下处理低频
    lowAppleWeightlowOrangeWeight = getVarianceWeight(lowApplelowOrange)
    lowFusion = lowAppleWeight*lowApple + lowOrangeWeight*lowOrange
    # 以下处理高频
    for hi in range(13):
        waveRec=[]
        for highApplehighOrange in zip(appleWave[hi]orangeWave[hi]):
            highAppWidthhighAppHeight=highApple.shape
            highOrangeWidthhighOrangeHeight=highOrange.shape
            highFusion = np.zeros(highApple.shape)
            contrastApple = getContrastImg(lowApplehighApple)
            contrastOrange = getContrastImg(lowOrangehighOrange)
            rowcol = highApple.shape
            for i in xrange(row):
                for j in xrange(col):
                    if contrastApple[ij] > contrastOrange[ij]:
                        highFusion[ij] = highApple[ij]
                    else:
                        highFusion[ij] = highOrange[ij]
            waveRec.append(highFusion)
        recwave=(lowFusiontuple(waveRec))
        lowFusion=pywt.idwt2(recwave‘haar‘)
        lowApple=lowFusion;lowOrange=lowFusion
    return lowFusion

# 求Laplace金字塔
def getLaplacePyr(img):
    firstLevel=img.copy()
    secondLevel=cv2.pyrDown(firstLevel)
    lowFreq=cv2.pyrUp(secondLevel)
    highFreq=cv2.subtract(firstLevel_sameSize(firstLevellowFreq))
    return lowFreqhighFreq
 
# 计算对比度,优化后不需要这个函数了,扔在这里看看公式就行
def _getContrastValue(highWinlowWin):
    rowcol = highWin.shape
    contrastValue = 0.00
    for i in xrange(row):
        for j in xrange(col):
            contrastValue += (float(highWin[ij])/lowWin[ij])**2
    return contrastVal

评论

共有 条评论