{"id":322,"date":"2021-10-16T10:54:16","date_gmt":"2021-10-16T10:54:16","guid":{"rendered":"http:\/\/liipetti.net\/retkia\/?p=322"},"modified":"2021-10-16T11:06:05","modified_gmt":"2021-10-16T11:06:05","slug":"kuvien-kasittely-pythonilla-osa-1","status":"publish","type":"post","link":"https:\/\/liipetti.net\/retkia\/kuvien-kasittely-pythonilla-osa-1\/","title":{"rendered":"Kuvien k\u00e4sittely pythonilla, osa 1"},"content":{"rendered":"\n<p>Neurokuvatreenien yhteydess\u00e4 nousee yhten\u00e4\u00e4n esille, ett\u00e4 siin\u00e4 on kyseess\u00e4 uusi paradigma k\u00e4sitell\u00e4 ja generoida kuvia. T\u00e4ss\u00e4 sarjassa katsotaan sit\u00e4 &#8221;vanhaa&#8221; mallia, jossa k\u00e4yd\u00e4\u00e4n suoraan k\u00e4siksi kuvan pikseleihin, jota kaiken aikaa tarvitaan my\u00f6s neurokuvanteossa. K\u00e4yt\u00e4nn\u00f6ss\u00e4 melkeinp\u00e4 enemm\u00e4n n\u00e4it\u00e4 kuin sit\u00e4 syv\u00e4oppimista.<\/p>\n\n\n\n<p>K\u00e4yt\u00e4mme python-ohjelmointikielt\u00e4 ja opencv-kirjastoa. Kuten neurokuvatreenit, t\u00e4m\u00e4k\u00e4\u00e4n ei ole pythonin peruskurssi. Esittelen miten hommat toimivat ja k\u00e4yt\u00e4n siin\u00e4 pythonia ja opencv:t\u00e4 esimerkkin\u00e4. <\/p>\n\n\n\n<p>L\u00e4hdet\u00e4\u00e4n siit\u00e4 ett\u00e4 meill\u00e4 on kansiossa kuvatiedosto, vaikkapa test4.png. Avaan python-tulkin, luen opencv-kirjastolla kuvan ja katsotaan mit\u00e4 se on sy\u00f6nyt. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; import cv2\n&gt;&gt;&gt; im = cv2.imread(\"test4.png\")\n&gt;&gt;&gt; im.shape\n(480, 640, 3)\n&gt;&gt;&gt; im.min()\n1\n&gt;&gt;&gt; im.max()\n252\n&gt;&gt;&gt; im[0,0]\narray([118, 163, 224], dtype=uint8)<\/pre>\n\n\n\n<p>Mit\u00e4 tapahtui? Luimme kuvan muuttujaan im, n\u00e4emme ett\u00e4 sen mitat ovat 480x640x3, mitk\u00e4 vastaavat kuvan korkeutta ja leveytt\u00e4, ja 3 vastaa kuvan kolmea v\u00e4rikanavaa, RGB eli punainen, vihre\u00e4 ja sininen. Katsomme tuossa viel\u00e4, ett\u00e4 kuvassamme v\u00e4rikanavien arvot ovat v\u00e4lill\u00e4 1&#8230;252. <\/p>\n\n\n\n<p>Kukin pikseli esitet\u00e4\u00e4n siis kolmella v\u00e4rikanavalla, joiden arvot ovat kokonaislukuja v\u00e4lill\u00e4 0..255, juuri se mik\u00e4 kahdeksalla bitill\u00e4 voidaan esitt\u00e4\u00e4. <\/p>\n\n\n\n<p>Lopuksi katsomme oikeassa yl\u00e4nurkassa olevan pikselin arvon: 118, 163, 224. T\u00e4ss\u00e4 kohtaa pit\u00e4\u00e4 varoittaa: opencv:ss\u00e4 v\u00e4rikanavien j\u00e4rjestys on BGR, eli tuossa siis punainen on kirkkain, ei sininen.<\/p>\n\n\n\n<p>Voisimme muuttaa tuon pikselin arvon yksinkertaisesti n\u00e4in. Talletamme sen my\u00f6s levylle jotta n\u00e4emme miten k\u00e4vi. Tosin yhden pikselin muutosta ei kovin selv\u00e4sti taida huomata.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; im[0,0] = (0, 0, 255)\n&gt;&gt;&gt; cv2.imwrite(\"test4b.png\", im)\nTrue<\/pre>\n\n\n\n<p>Muutetaan kerralla isompi alue jostain kuvan keskivaiheilta:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; im[200:250,300:360] = (0, 0, 255)\n&gt;&gt;&gt; cv2.imwrite(\"test4c.png\", im)\nTrue<\/pre>\n\n\n\n<p>Ja nyt kun katsomme mit\u00e4 tiedostosta l\u00f6ytyy, on sinne kuvaan todella ilmaantunut punainen suorakulmio.<br><\/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\/test4c.png\" alt=\"\" class=\"wp-image-328\" width=\"341\" height=\"256\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-150x113.png 150w\" sizes=\"auto, (max-width: 341px) 100vw, 341px\" \/><\/figure>\n\n\n\n<p>Luetaanpa toinenkin kuva ja kokeilla laittaa kuvat p\u00e4\u00e4llekk\u00e4in. Huomataan ett\u00e4 toinen kuva on eri kokoinen, joten leikataan siit\u00e4 sopiva pala.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; im2 = cv2.imread(\"test.png\")\n&gt;&gt;&gt; im2.shape\n(1000, 871, 3)\n&gt;&gt;&gt; h = 480\n&gt;&gt;&gt; w = 640\n&gt;&gt;&gt; im2b = im2[200:200+h, 100:100+w]\n&gt;&gt;&gt; im2b.shape\n(480, 640, 3)<\/pre>\n\n\n\n<p>Lasketaan sitten kuvien keskiarvo, siis kuvat pikseleitt\u00e4in yhteen ja jaetaan kahdella. T\u00e4ss\u00e4 nyt tulee kuitenkin rajoja vastaan&#8230; useiden pikselien summa nousee yli yl\u00e4rajan 255 ja kun se viel\u00e4 jaetaan kahdella, lopputulos ei koskaan nouse yli 128:n kirkkaat s\u00e4vyt leikkautuvat pois ja kuvasta tulee tummas\u00e4vyinen. Kokeillaan kuitenkin, kokeilemalla l\u00f6yt\u00e4\u00e4 usein mielenkiintoisia efektej\u00e4. Eli tuossa vasemmalla ensimm\u00e4inen kuva, sitten toisesta kuvast rajaamamme palanen, ja lopuksi laskutoimituksemme tulos. Ei hassumpi.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-1.png\" alt=\"\" data-id=\"329\" data-link=\"https:\/\/liipetti.net\/retkia\/?attachment_id=329\" class=\"wp-image-329\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-1.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-1-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-1-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/test4c-1-150x113.png 150w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/im2b.png\" alt=\"\" data-id=\"330\" data-link=\"https:\/\/liipetti.net\/retkia\/?attachment_id=330\" class=\"wp-image-330\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/im2b.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/im2b-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/im2b-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/im2b-150x113.png 150w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9.png\" alt=\"\" data-id=\"331\" data-full-url=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9.png\" data-link=\"https:\/\/liipetti.net\/retkia\/?attachment_id=331\" class=\"wp-image-331\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9-150x113.png 150w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Tuo voidaan v\u00e4ltt\u00e4\u00e4 tekem\u00e4ll\u00e4 jakolasku ennen summausta. Periaatteessa siin\u00e4 menetet\u00e4\u00e4n tarkkuutta, mutta kokeillaan. Kaksi per\u00e4kk\u00e4ist\u00e4 jakomerkki\u00e4 tuossa tarkoittaa ett\u00e4 lasketaan kokonaisluvuilla, haluamme tuloksenkin kokonaislukuna.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt;&gt;&gt; im9b = im\/\/2 + im2b\/\/2\n&gt;&gt;&gt; cv2.imwrite(\"tulos9b.png\", im9b)\nTrue<\/pre>\n\n\n\n<p>Ja nyt saammekin t\u00e4mm\u00f6isen, mik\u00e4 riitt\u00e4\u00e4 meille t\u00e4ss\u00e4 vaiheessa. K\u00e4yt\u00e4nn\u00f6ss\u00e4 t\u00e4ss\u00e4 siirrytt\u00e4isiin laskennan ajaksi liukulukuihin ja lopputulos muunnettaisiin sitten taas kokonaisluvuksi. Mutta ei menn\u00e4 siihen viel\u00e4.<\/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\/tulos9b.png\" alt=\"\" class=\"wp-image-333\" width=\"347\" height=\"260\" srcset=\"https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9b.png 640w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9b-300x225.png 300w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9b-200x150.png 200w, https:\/\/liipetti.net\/retkia\/wp-content\/uploads\/2021\/10\/tulos9b-150x113.png 150w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/figure>\n\n\n\n<p>T\u00e4ss\u00e4 osassa siis olemme lukeneet kuvatiedostoja levylt\u00e4, l\u00f6yt\u00e4neet kuvan pikselit taulukkona ja kokeilleet muuttaa niit\u00e4 ja sitten taas tallettaneet muunnetun kuvan levylle. N\u00e4in se kuvank\u00e4sittely siis menee. Katsotaan jatkossa lis\u00e4\u00e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neurokuvatreenien yhteydess\u00e4 nousee yhten\u00e4\u00e4n esille, ett\u00e4 siin\u00e4 on kyseess\u00e4 uusi paradigma k\u00e4sitell\u00e4 ja generoida kuvia. T\u00e4ss\u00e4 sarjassa katsotaan sit\u00e4 &#8221;vanhaa&#8221; mallia, jossa k\u00e4yd\u00e4\u00e4n suoraan k\u00e4siksi kuvan pikseleihin, jota kaiken aikaa tarvitaan my\u00f6s neurokuvanteossa. K\u00e4yt\u00e4nn\u00f6ss\u00e4 melkeinp\u00e4 enemm\u00e4n n\u00e4it\u00e4 kuin sit\u00e4 syv\u00e4oppimista. K\u00e4yt\u00e4mme python-ohjelmointikielt\u00e4 ja opencv-kirjastoa. Kuten neurokuvatreenit, t\u00e4m\u00e4k\u00e4\u00e4n ei ole pythonin\u2026<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/liipetti.net\/retkia\/kuvien-kasittely-pythonilla-osa-1\/\">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-322","post","type-post","status-publish","format-standard","hentry","category-kuvankasittely"],"_links":{"self":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/322","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=322"}],"version-history":[{"count":9,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/322\/revisions"}],"predecessor-version":[{"id":336,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/322\/revisions\/336"}],"wp:attachment":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/media?parent=322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/categories?post=322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/tags?post=322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}