Multimediální technologie – Cvičení 3


Zadání

  1. Open CV – import cv2
    Načtení / uložení obrazu:

    bgr = cv2.imread('ob.bmp')
    rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
    plt.imshow(rgb)

    Zjištění velikosti obrazu:

    height = ob.shape[0] width = ob.shape[1]

    Zobrazení obrazu:

    plt.imshow(bgr)
    plt.imshow(gray1, cmap='gray')
    plt.colorbar()

    Převod do šedi:
    I = 0.3R + 0.59G + 0.11B

    gray = cv2.cvtColor(bgr, cv2.COLOR_RGB2GRAY)

     

  2. Vytvořte funkci pro načítání bitmapy z binárního souboru – obdoba funkce imread. Načtěte pomocí této funkce obraz cv03_objekty1.bmp a zobrazte pomocí imshow.
  3. Obrázek cv03_objekty1.bmp převeďte do složek barevných prostorů a zobrazte, pro barevné prostory využijte:
    COLOR_RGB2GRAY
    COLOR_RGB2HSV
    COLOR_RGB2YCrCb

    Jednotlivé barevné složky zobrazte jako šedotónové obrázky, tj. převeďte barvy do intervalu 0..255.

  4. Obrázek cv03_red_object.jpg převeďte do složky r = R/(R+G+B). Nahraďte všechny pixely pro než r < 0.5 bílou barvou. Výsledek zobrazte.

Soubory


Řešení

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

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

def readBMP(fileName):
    with open(fileName, 'rb') as f:
        #HEAD
        data = f.read(2)
        if data != 'BM':
            print 'Soubor není typu BM'
            sys.exit()

        A1 = struct.unpack('i', f.read(4))[0]
        future = struct.unpack('i', f.read(4))[0]
        head = struct.unpack('i', f.read(4))[0]
        win = struct.unpack('i', f.read(4))[0]
        width = struct.unpack('i', f.read(4))[0]
        height = struct.unpack('i', f.read(4))[0]
        area = struct.unpack('h', f.read(2))[0]
        bits = struct.unpack('h', f.read(2))[0]

        read = bits / 3 / 8
        if read == 1:
            char = 'B'
        elif read == 2:
            char = 'h'
        elif read == 4:
            char = 'i'
        else:
            print 'Špatný počet bitu na pixel'

        comp = struct.unpack('i', f.read(4))[0]
        length = struct.unpack('i', f.read(4))[0]

        if length % 4 != 0:
            print 'Špatná velikost'
            sys.exit()

        HorDim = struct.unpack('i', f.read(4))[0]
        VerDim = struct.unpack('i', f.read(4))[0]
        nColor = struct.unpack('i', f.read(4))[0]
        impColor = struct.unpack('i', f.read(4))[0]

        data = np.zeros((height, width, 3))

        for i in range(height - 1, 0, -1):
            for j in range(0, width):
                for k in range(0, 3):
                    data[i][j][k] = struct.unpack(char, f.read(read))[0]
            f.read(1)

        rgb = data.astype('uint8')
        data = cv2.cvtColor(rgb, cv2.COLOR_BGR2RGB)
        return data

def rgb2gray(image):
    plt.figure('RGB2GRAY')

    plt.subplot(121)
    plt.title("RGB")
    plt.imshow(image)

    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    plt.subplot(122)
    plt.title("GRAY")
    plt.imshow(gray, cmap=plt.cm.gray)
    plt.show()

def rgb2hsv(image):
    plt.figure('RGB2HSV')
    hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

    h = hsv[..., ..., 0]
    s = hsv[..., ..., 1]
    v = hsv[..., ..., 2]

    plt.subplot(221)
    plt.title("RGB")
    plt.imshow(image)

    plt.subplot(222)
    plt.title("H")
    plt.imshow(h)

    plt.subplot(223)
    plt.title("S")
    plt.imshow(s)

    plt.subplot(224)
    plt.title("V")
    plt.imshow(v)

    plt.show()

def rgb2ycrcb(image):
    plt.figure('RGB2YYCRCB')

    plt.subplot(321)
    plt.title("RGB")
    plt.imshow(image)

    ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCR_CB)
    plt.subplot(322)
    plt.title("YCRCB")
    plt.imshow(ycrcb, cmap=plt.cm.gray)

    y = ycrcb[..., ..., 0]
    plt.subplot(323)
    plt.title("Y")
    plt.imshow(y)

    cr = ycrcb[..., ..., 1]
    plt.subplot(324)
    plt.title("Cr")
    plt.imshow(cr)

    cb = ycrcb[..., ..., 2]
    plt.subplot(325)
    plt.title("Cb")
    plt.imshow(cb)

    plt.show()

def main():
    #Uloha 1
    image = readBMP('cv03_objekty1.bmp')
    plt.imshow(image)
    plt.show()

    #Uloha 2
    rgb2gray(image)
    rgb2hsv(image)
    rgb2ycrcb(image)

    #Uloha 3
    bgr = cv2.imread('cv03_red_object.jpg')
    rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)

    channels = np.zeros(3)

    for i in range(0, rgb.shape[0]):
        for j in range(0, rgb.shape[1]):
            for k in range(0, 3):
               channels[k] = rgb[i][j][k]

            r = channels[0]/(channels[0]+channels[1]+channels[2])
            if(r < 0.5):
                rgb[i][j]=(255,255,255)

    plt.imshow(rgb)
    pylab.show()

if __name__ == "__main__":
    main()

Napsat komentář