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 | Boroskopická sonda |
---|
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)
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)
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)
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
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.
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)
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)
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ě