Perspektiva obrazu - kartézský a polární souřadný systém

Cvičení je zaměřené na práci s polárními souřadnicemi při využití nestandardních 360° objektivů od firmy Opto Engineering. Způsob použití takových objektivů je demonstrován v tutoriálu na stránkách výrobce. Jedná o následující optické systémy:

Optické systémy

Pericentrický objektiv No description has been provided for this image Boroskopická sonda No description has been provided for this image

Pericentrický objektiv umožňuje podívat se nejen na vršek objektu, ale dokonce i na jeho strany zároveň. Typickými aplikacemi jsou například kontrola potisků víček či kontrola defektů hrdel lahví.

Boroskopická sonda díky zrcadlu umožnuje podívat se 360 ° dokola kolem sebe. Typickými aplikacemi jsou průmyslové inspekce děr či kontroly správnosti závitů.

Souřadné systémy

Potřebnou prerekvizitou je znalost existence kartézského a polárního souřadného systému a tedy dvojí možnosti zápisu souřadnic. Pěkně je to vysvětleno například na webu Math is fun.

Proč budeme tuto znalost potřebovat je jasné ve chvíli, když si zobrazíte ukázky obrázků získaných jednotlivými optickými systémy.

# Youtube video s ukázkami funkcí v kartézských a polárních souřadnicích
from IPython.display import Audio, Image, YouTubeVideo
YouTubeVideo(id='Uros5bufLJI', width=600, height=300)

Import knihoven a konfigurace

import os
import io

import cv2
import numpy as np
import matplotlib.pyplot as plt

from improutils import *

%matplotlib inline
np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})

Pomocné funkce

Z následujících funkcí je potřeba vybírat ty vhodné pro splnění úkolu.

Seznam funkcí pro přehlednost:


Úkol

Seznamte se s transformací mezi kartézským a polárním systémem souřadnic. Vyzkoušejte si, jak transformace funguje jak na umělých datech, tak na datech reálných. Uvědomte si, jak záleží na správném nastavení měřicího systému při vizuální kontrole pomocí 360° objektivů.

Pro testování jsou připraveny funkce warp_to_cartesian() a warp_to_polar().

1) Vytvořte umělý obrázek soustředných kružnic

Zvolte vlastní velikost obrázku (doporučuje se velikost mezi 200 a 1000). Následně na obrázek aplikujte transformaci a oba obrázky zobrazte.

art_circ_image = artificial_circle_image(512) ### tvorba umělého obrázku
art_circ_image_trans = warp_to_cartesian(art_circ_image) ### správná transformace

plot_images(art_circ_image, art_circ_image_trans, normalize=True)
No description has been provided for this image

2) Vytvořte funkci pro generování umělého obrázku

Umělý obrázek by se měl stávat ze samých svislých čar (viz výsledek Úkolu 1). Následně na obrázek aplikujte transformaci a zobrazte oba obrázky.

# def artificial_line_image(size):
#     ### vlastní postup
# #     img_art_line = artif(size)
#     img = np.zeros((size, size))
#     for i 
#     return img_art_line
def artificial_line_image(size):
    ### vlastní postup

    img = artificial_circle_image(size) ### tvorba umělého obrázku
    img = warp_to_cartesian(img) ### správná transformace
    return img
art_line_image = artificial_line_image(512)
art_line_image_trans = warp_to_polar(art_line_image) ### správná transformace

plot_images(art_line_image, art_line_image_trans, normalize=True)
No description has been provided for this image

3) Zobrazte testovací obrázek

Načtěte testovací obrázek z boroskopické sondy mech_test.png. Zobrazte ho společně s jeho transformací.

image_path = 'data/mech_test.png' ### cesta k obrázku
image_test = cv2.imread(image_path)

image_test_trans = warp_to_cartesian(image_test) ### správná transformace

# Zobrazí obrázky
plot_images(image_test, image_test_trans)
No description has been provided for this image

4) Přečtěte text na testovacím obrázku

Vytvořte jednoduchý algoritmus předzpracování obrazu pro čtení pomocí OCR.

 
def preprocess_for_ocr(img):
    ### vlastní postup
    img = to_gray(img)
    img = rotate(img, 90)
    img = crop(img, 0, 500, 100000, 580)
    mask = segmentation_auto_threshold(img)
    mask = np.array(mask, dtype=np.uint8)
    print(mask.shape)
    mask = cv2.resize(mask,(1100, 80))
    return mask


# Předzpracuje obrázek a zobrazí
image_ocr = preprocess_for_ocr(image_test_trans)
plot_images(image_ocr)

# Přečte pomocí OCR
text = ocr(image_ocr)
print(text.split('\n')[0])
(80, 1997)
Testing if line is straight
No description has been provided for this image

5) Načtěte uložený obrázek a přečtěte text bar kódu

Načtěte obrázek krabičky pořízené pomocí pericentrického objektivu.

No description has been provided for this image
image_saved_path = 'data/peri_plastic_container.png' ### cesta k obrázku
image = load_image(image_saved_path) ### načtení obrázku

image_warped = warp_to_cartesian(image) ### správná transformace
plot_images(image, image_warped)
print(image_warped.shape)
(2279, 725, 3)
No description has been provided for this image

Ořízněte si obrázek podle souřadnic bar kódu (lze zjistit ručně). Dále zpracujte obrázek tak, abyste získali ideální binární obraz, který lze využít pro OCR čtení nástrojem Tesseract.

Klasické workflow zpracování obrazu je následující: oříznutí, filtrace, segmentace, výběr vhodných objektů.

# Doplňte souřadnice pro oříznutí obrázku
# Formát: TL_x, TL_y, BR_x, BR_y
# ... TL = top-left, BR = bottom-right
CROP_COORDINATES = [
    345, 650, 480, 900
    
]

# Předzpracování
image_proc = to_gray(image_warped)

# Oříznutí
image_proc = crop(image_proc, *CROP_COORDINATES)
# plot_images(image_proc)

### vlastní postup
img1 = rotate(image_proc, 180)
# plot_images(img)
print(img1.shape)
img2 = cv2.resize(img1, (350, 135))
img3 = filtration_gauss(img2, 1, 1)

mask = segmentation_one_threshold(img3, 150)
# mask = segmentation_o_threshold(img3, 150)
mask = negative(mask)
# print(mask.s)
# mask = crop(mask, 65, 100, 350, 135)
# mask = crop(mask, 65, 100, 350, 135)
drawn, count, contours  = find_contours(mask, 50, 10000)


filtered = []
for c in contours:
    r = cv2.boundingRect(c)
    w = r[2]
#     print(w)
    if w > 10:
        filtered.append(c)

new = np.zeros(mask.shape, dtype=np.uint8)
cv2.drawContours(new, filtered, -1, 255,  thickness=cv2.FILLED)
# print(type(new[0,0]))
# print(type(mask[0, 0]))
new = np.bitwise_and(new, mask)
plot_images(new)
drawn = np.bitwise_and(mask, drawn)

# Zobrazení výsledků
plot_images(image_proc, img1, img2, img3, mask, new) ###
(250, 135)
No description has been provided for this image No description has been provided for this image

Přečtěte pomocí OCR nástrojem Tesseract.

ref = '8017 6312'

# Čtení pomocí OCR
text = ocr(drawn) ### doplnit

# Zhodnocení
if ref in text:
    print('Výborně')
else:
    print('Skoro. Vyšlo ti: ' + text)
Výborně