Multimediální technologie – Cvičení 4


Zadání

  1. Vylepšete pomocí jasové korekce obrázky Cv04_porucha1.bmp a Cv04_porucha2.bmp. Etalony poruch jsou v souborech Cv04_porucha1_etalon.bmp a Cv04_porucha2_etalon.bmp, c = 255. Každý výsledek zobrazte společně s původním v samostatném okně.
  2. Pro obrázek Cv04_rentgen.bmp naprogramujte ekvalizaci histogramu dle:
    q=T(p)=\frac{q_{k}-q_{0}}{N.M}\sum_{i=p_{0}}^{p}H(i)+q_{0}
    q_{0},p_{0}=0 a q_{k}=255
    Zobrazte původní a ekvalizovaný obrázek spolu s příslušnými histogramy.

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 plot(with_etalon, without_etalon, title):
    plt.figure(title)
    plt.subplot(121)
    plt.imshow(without_etalon)
    plt.subplot(122)
    plt.imshow(with_etalon)
    plt.show()

def rentgen(img, title):
    rentgen = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

    height, width = img.shape[:2]

    q = np.zeros((height, width, 3))
    P = rentgen

    histogram_original, b = np.histogram(rentgen[:,:], 256, (0, 255))

    for x in range(height):
        for y in range(width):
            suma = np.sum(histogram_original[0:P[x,y]])
            q[x,y,:]=suma * 255/(height * width)

    histogram_equalized, b2 = np.histogram(q[:,:], 256, (0, 255))

    plt.figure(title)
    plt.subplot(221)
    plt.title("Original")
    plt.imshow(img)

    plt.subplot(222)
    plt.title("Original histogram")
    plt.plot(histogram_original)

    plt.subplot(223)
    plt.title("Ekvalizace")
    plt.imshow(q.astype('uint8'))

    plt.subplot(224)
    plt.title("Ekvalizace histogram")
    plt.plot(histogram_equalized)
    plt.show()

def main():
    etalon1 = cv2.imread("Cv04_porucha1_etalon.bmp")
    etalon2 = cv2.imread("Cv04_porucha2_etalon.bmp")

    img1 = cv2.imread("Cv04_porucha1.bmp")
    img2 = cv2.imread("Cv04_porucha2.bmp")
    img3 = cv2.imread("cv04_rentgen.bmp")

    c=255

    height, width = img1.shape[:2]

    grad_noise1 = (c * img1.astype(float)) / etalon1.astype(float)
    grad_noise2 = (c * img2.astype(float)) / etalon2.astype(float)

    #plot(grad_noise1, grad_noise2, "Obr. etalon")

    without_etalon = cv2.cvtColor(grad_noise1.astype('uint8'),cv2.COLOR_RGB2BGR)
    with_etalon = cv2.cvtColor(img1.astype('uint8'),cv2.COLOR_RGB2BGR)

    plot(with_etalon, without_etalon, "Obr. 1")

    without_etalon = cv2.cvtColor(grad_noise1.astype('uint8'),cv2.COLOR_RGB2BGR)
    with_etalon = cv2.cvtColor(img2.astype('uint8'),cv2.COLOR_RGB2BGR)

    plot(with_etalon, without_etalon, "Obr. 2")

    #Uloha 2
    rentgen(img3, "Obr. 3 - Rentgen")

if __name__ == "__main__":
    main()

Napsat komentář