0
点赞
收藏
分享

微信扫一扫

基于PCA的图像融合(python)

RIOChing 2022-04-14 阅读 169
#!/usr/bin/env python
# encoding: utf-8
import os
from ImageFusion import ImageFusion
from PIL import Image
import numpy as np
import pylab as plt
import cv2
import time
all_folds1 = os.listdir(r'D:\data-5000\S-GS-500/')
all_folds2 = os.listdir(r'D:\data-5000\B-500/')
all_folds3 = os.listdir(r'D:\data-5000\C-500/')
all_folds4 = os.listdir(r'D:\data-5000\A-500/')
imList1 = []
imList2 = []
imList3 = []
imList4 = []
for s in all_folds1:
    imList1.append(s)
for b in all_folds2:
    imList2.append(b)
for c in all_folds3:
    imList3.append(c)
for a in all_folds4:
    imList4.append(a)
# img1 = cv2.imread(r'D:\data-5000\S-GS\{}'.format(all_folds1[s]))
# img2 = cv2.imread(r'D:\data-5000\B\{}'.format(all_folds2[b]))
# img3 = cv2.imread(r'D:\data-5000\clahe\{}'.format(all_folds3[c]))
# img4 = cv2.imread(r'D:\data-5000\AutomatedMSRCR\{}'.format(all_folds4[a]))

# imLists = [imList1[:],imList2[:],imList3[:],imList4[:]]
# print(imLists)
class FusionPCA(ImageFusion):
    """ Image fusion based PCA"""
    def __init__(self, imageNames):
        self._imageNames = imageNames
        self._images = []
        self._fusionImage = None

    def _load_images(self):
        for name in self._imageNames:
            self._images.append(cv2.imread(name))
    def fusion(self):
        self._load_images()
        imageSize = self._images[0].size
        # Todo: for more than two images
        allImage = np.concatenate((self._images[0].reshape(1, imageSize), self._images[1].reshape(1, imageSize),self._images[2].reshape(1,imageSize),self._images[3].reshape(1,imageSize)), axis=0)
        covImage = np.cov(allImage)
        D, V = np.linalg.eig(covImage)
        D = D.tolist()
        LD = max(D)
        if D.index(LD) == 0:
            a = V[:, 0] / V[:, 0].sum()
        elif D.index(LD) == 1:
            a = V[:, 1] / V[:, 1].sum()
        elif D.index(LD) == 2:
            a = V[:, 2] / V[:, 2].sum()
        elif D.index(LD) == 3:
            a = V[:, 3] / V[:, 3].sum()
        # if D[0] > D[1]:
        #     a = V[:,0] / V[:,0].sum()
        # else:
        #     a = V[:,1] / V[:,1].sum()
        self._fusionImage = self._images[0]*a[0] + self._images[1]*a[1]+self._images[2]*a[2]+self._images[3]*a[3]
        return self._fusionImage
    #def plot(self):
    #     # plt.figure(0)
    #     # plt.gray()
    #     # plt.subplot(131)
    #     # plt.imshow(self._images[0])
    #     # plt.subplot(132)
    #     # plt.imshow(self._images[1])
    #     # plt.subplot(133)
    #     # plt.imshow(self._fusionImage)
    #     # plt.show()
    #cv2.imwrite(r'D:\data-5000\1/8.jpg',fu.fusion())

if __name__ == '__main__':
    i = 1
    while i <= 500:
        IMAGEPATH1 = r'D:\data-5000\S-GS-500/'
        IMAGEPATH2 = r'D:\data-5000\B-500/'
        IMAGEPATH3 = r'D:\data-5000\C-500/'
        IMAGEPATH4 = r'D:\data-5000\A-500/'
        imLists = [IMAGEPATH1 + "{}.jpg".format(i), IMAGEPATH2 + "{}.jpg".format(i), IMAGEPATH3 + "{}.jpg".format(i),
                   IMAGEPATH4 + "{}.jpg".format(i)]
        start = time.time()
        fu = FusionPCA(imLists)
        fu.fusion()
        cv2.imwrite(r'D:\data-5000\PCA\{}.jpg'.format(i), fu.fusion())
        i += 1
        over = time.time()
        times = over - start
        print('花费时间:{}s'.format(times))

举报

相关推荐

0 条评论