{"id":337,"date":"2021-10-16T11:47:42","date_gmt":"2021-10-16T11:47:42","guid":{"rendered":"http:\/\/liipetti.net\/retkia\/?p=337"},"modified":"2021-10-16T11:52:29","modified_gmt":"2021-10-16T11:52:29","slug":"kuvan-kasittely-pythonilla-osa-2","status":"publish","type":"post","link":"https:\/\/liipetti.net\/retkia\/kuvan-kasittely-pythonilla-osa-2\/","title":{"rendered":"Kuvan k\u00e4sittely pythonilla, osa 2"},"content":{"rendered":"\n<p>Kokeillaan t\u00e4ll\u00e4 kertaa maskien k\u00e4ytt\u00f6\u00e4. Maski on harmaas\u00e4vykuva, jolla voidaan rajata kuvista mielivaltaisia alueita. K\u00e4yt\u00e4n t\u00e4ss\u00e4 maskina t\u00e4t\u00e4 kuvaa. Huomaa, ett\u00e4 maskin ei tarvitse olla joko\/tai, vaan s\u00e4vyjen avulla voidaan my\u00f6s tehd\u00e4 esim. pehmeit\u00e4 siirtymi\u00e4 kuvasta toiseen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2mask.png\" alt=\"\" class=\"wp-image-339\" width=\"452\" height=\"320\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2mask.png 841w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2mask-300x212.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2mask-768x543.png 768w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2mask-212x150.png 212w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test2mask-150x106.png 150w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/figure>\n\n\n\n<p>Luetaan tuo maski ja muunnetaan se t\u00e4ll\u00e4 kertaa liukuluvuiksi v\u00e4lill\u00e4 0..1. Muutenkin tehd\u00e4\u00e4n laskutoimitukset nyt liukuluvuilla, jottei 255-leikkuri p\u00e4\u00e4se nyt sotkemaan. Ja samantien kannattaa muistaa sekin, ett\u00e4 tuon leikkurin aiheuttamat sivuvaikutukset ovat usein efektein\u00e4 mielenkiintoisia. Ja sitten hommiin, ensin tarvitsemme numpy-kirjaston jonka otamme k\u00e4ytt\u00f6\u00f6n lyhennetyll\u00e4 nimell\u00e4 np.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; import numpy as np\n&gt;&gt;&gt; mask = cv2.imread(\"test2mask.png\")\n&gt;&gt;&gt; mask = mask.astype(np.float32)\/255\n&gt;&gt;&gt; mask.min()\n0.0\n&gt;&gt;&gt; mask.max()\n0.99215686<\/pre>\n\n\n\n<p>Luemme sitten jo tutun kuvan levylt\u00e4. Huomaamme ett\u00e4 maski ja kuva ovat eri kokoiset, skaalamme maskin samaan kokoon kuin kuva. Sitten kerromme kuvan maskilla, lopputuloksena saadaan kuva jossa maskin tummat kohdat ovat tummia ja maskin vaaleissa osissa n\u00e4kyy alkuper\u00e4inen kuva. Miksi? Meill\u00e4 on nyt maski, jossa musta on 0 ja valkoinen 1, ja sill\u00e4 me kerromme kaikki pikselit.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; im = cv2.imread(\"test4.png\")\n&gt;&gt;&gt; im.shape\n(480, 640, 3)\n&gt;&gt;&gt; mask.shape\n(595, 841, 3)\n&gt;&gt;&gt; mask2 = cv2.resize(mask, (640, 480))\n&gt;&gt;&gt; mask2.shape\n(480, 640, 3)\n&gt;&gt;&gt; out = mask2 * im.astype(np.float32)\n&gt;&gt;&gt; out.max()\n245.40228\n&gt;&gt;&gt; cv2.imwrite(\"masked.png\", out.astype(np.uint8))\nTrue<\/pre>\n\n\n\n<p>Ja se toimi. Huomaa, ett\u00e4 muunnimme lopputuloksen tuossa kokonaisluvuksi (n p.uint8) ennen tallennusta. T\u00e4m\u00e4 siksi, ett\u00e4 muuten opencv olettaa ett\u00e4 koska arvot ovat liukulukuja, pikselien arvot ovat v\u00e4lill\u00e4 0..1. Siit\u00e4kin kyll\u00e4 syntyy v\u00e4lill\u00e4 j\u00e4nn\u00e4 efekti.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked.png\" alt=\"\" class=\"wp-image-341\" width=\"350\" height=\"263\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked-150x113.png 150w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/figure>\n\n\n\n<p>Jos haluamme tuohon muun kuin mustan taustan, niin haetaan siihen toinen kuva, tehd\u00e4\u00e4n sille maskaus k\u00e4\u00e4nteisell\u00e4 maskilla ja katsotaan ensin milt\u00e4 se n\u00e4ytt\u00e4\u00e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; bkg = cv2.imread(\"tausta.jpg\")\n&gt;&gt;&gt; bkg.shape\n(480, 640, 3)\n&gt;&gt;&gt; mask2b = 1 - mask2 \n&gt;&gt;&gt; out2 = mask2b * bkg.astype(np.float32)\n&gt;&gt;&gt; cv2.imwrite(\"masked2.png\", out2.astype(np.uint8))\nTrue<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked2.png\" alt=\"\" class=\"wp-image-343\" width=\"365\" height=\"274\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked2.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked2-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked2-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/masked2-150x113.png 150w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><\/figure>\n\n\n\n<p>Jep, eli nyt meill\u00e4 on mustaa eli nollia siin\u00e4 miss\u00e4 toisessa kuvassa on sis\u00e4lt\u00f6\u00e4, ja p\u00e4invastoin. Nyt meid\u00e4n pit\u00e4isi voida aika turvallisesti summata n\u00e4m\u00e4 kaksi kuvaa ilman ett\u00e4 255-leikkuri iskee. Kokeillaan.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; out9 = out + out2\n&gt;&gt;&gt; cv2.imwrite(\"combined.png\", out9)\nTrue<\/pre>\n\n\n\n<p>Ja tuloksena on kuin onkin kuva jossa maskin perusteella on yhdistetty etuala ja tausta eri kuvista. Ainakin itselleni ollut hyvin hy\u00f6dyllist\u00e4 tekniikkaa, mm. teoksessa <em>Virtual vacation photos<\/em>, joka oli esill\u00e4 Pesula-galleriassa syyskuussa 2020 (alemmassa kuvassa oikealla).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/combined.png\" alt=\"\" class=\"wp-image-346\" width=\"545\" height=\"409\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/combined.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/combined-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/combined-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/combined-150x113.png 150w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-1024x683.jpg\" alt=\"\" class=\"wp-image-344\" width=\"545\" height=\"363\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-1024x683.jpg 1024w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-300x200.jpg 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-768x512.jpg 768w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-1536x1024.jpg 1536w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-2048x1365.jpg 2048w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-225x150.jpg 225w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/toyryla_3-150x100.jpg 150w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kokeillaan t\u00e4ll\u00e4 kertaa maskien k\u00e4ytt\u00f6\u00e4. Maski on harmaas\u00e4vykuva, jolla voidaan rajata kuvista mielivaltaisia alueita. K\u00e4yt\u00e4n t\u00e4ss\u00e4 maskina t\u00e4t\u00e4 kuvaa. Huomaa, ett\u00e4 maskin ei tarvitse olla joko\/tai, vaan s\u00e4vyjen avulla voidaan my\u00f6s tehd\u00e4 esim. pehmeit\u00e4 siirtymi\u00e4 kuvasta toiseen. Luetaan tuo maski ja muunnetaan se t\u00e4ll\u00e4 kertaa liukuluvuiksi v\u00e4lill\u00e4 0..1. Muutenkin tehd\u00e4\u00e4n\u2026<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/liipetti.net\/retkia\/kuvan-kasittely-pythonilla-osa-2\/\">Continue reading<i class=\"crycon-right-dir\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-337","post","type-post","status-publish","format-standard","hentry","category-kuvankasittely"],"_links":{"self":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/comments?post=337"}],"version-history":[{"count":6,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/337\/revisions"}],"predecessor-version":[{"id":348,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/337\/revisions\/348"}],"wp:attachment":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/media?parent=337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/categories?post=337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/tags?post=337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}