Multimediální technologie – Cvičení 9

Zadání

Naprogramujte algoritmus PCA pro převod barevného obrázku Cv09_obr.bmp do monochromatického, tj. zobrazte první hlavní komponentu z vlastního prostoru. Výsledek porovnejte s monochromatickým obrázkem převedeným z RGB pomocí funkce RGB2GRAY.

Soubory


Řešení

# -*- coding: utf-8 -*-
import os
import numpy as np
import matplotlib.pyplot as plt
import cv2

clear = lambda: os.system('cls')
clear()
plt.close('all')

def loadImage(fileName):
    bgr = cv2.imread(fileName)
    return bgr

def separate(bgr):
    B, G, R = cv2.split(bgr)

    B=np.double(B.flatten())
    G=np.double(G.flatten())
    R=np.double(R.flatten())

    return B, G, R

def mediumVector(B, G, R):
    diameter = (B+G+R)/3

    Wb= B - diameter
    Wg= G - diameter
    Wr= R - diameter

    return Wb, Wg, Wr, diameter

def matrixCreator(Wb, Wg, Wr):
    W=np.zeros((3,len(Wb)))
    W[0]=Wr
    W[1]=Wg
    W[2]=Wb
    TransponeMatrixW = W.transpose()
    matrixC = np.cov(W)

    return TransponeMatrixW, matrixC

def eigenValuesVectors(marixC):
    EVlues, EVectors = np.linalg.eigh(marixC)

    return EVlues, EVectors

def createEp(EValues, EVectors):
    shortEValues = np.argsort(EValues)
    Ep = EVectors[:,shortEValues]
    return Ep

def createK(matrixW, Ep, diameter, i):
    K= np.dot(matrixW, Ep[:,i])
    K = K + diameter
    Ki = createKi(K)
    return Ki

def createKi(K):
    Ki= np.zeros((302,444))
    for i in range(0,134088):
        Ki[i/444][i%444]=K[i]
    return Ki

def main():
    bgr = loadImage('Cv09_obr.bmp')
    B, G, R = separate(bgr)
    Wb, Wg, Wr, diameter = mediumVector(B, G, R)
    matrixW, matrixC = matrixCreator(Wb, Wg, Wr)
    EVlues, EVectors = eigenValuesVectors(matrixC)
    Ep = createEp(EVlues, EVectors)

    K1 = createK(matrixW, Ep, diameter, 0)
    K2 = createK(matrixW, Ep, diameter, 1)
    K3 = createK(matrixW, Ep, diameter, 2)

    figc = plt.figure()
    figc.add_subplot(2,2,1)
    plt.imshow(K1, cmap='gray')
    plt.title('K1')
    figc.add_subplot(2,2,2)
    plt.imshow(K2, cmap='gray')
    plt.title('K2')
    figc.add_subplot(2,2,3)
    plt.imshow(K3, cmap='gray')
    plt.title('K3')
    figc.add_subplot(2,2,4)
    plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY), cmap='gray')
    plt.title('Gray')
    plt.show()

if __name__ == "__main__":
    main()

You may also like...

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *