{"id":276,"date":"2022-04-19T09:00:44","date_gmt":"2022-04-19T00:00:44","guid":{"rendered":"https:\/\/is-ai.jp\/?p=276"},"modified":"2022-04-15T11:45:15","modified_gmt":"2022-04-15T02:45:15","slug":"%e3%80%90python%e3%80%91%e4%b8%87%e8%8f%af%e9%8f%a1%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b","status":"publish","type":"post","link":"https:\/\/is-ai.jp\/?p=276","title":{"rendered":"\u3010python\u3011\u4e07\u83ef\u93e1\u4f5c\u3063\u3066\u307f\u308b"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u306f\u3058\u3081\u306b<\/h4>\n\n\n\n<p>python\u3067\u4e07\u83ef\u93e1\uff08\u306e\u3088\u3046\u306a\u52d5\u4f5c\u3092\u3059\u308b\uff09\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u307e\u3057\u305f\u3002\u5b8c\u6210\u7269\u306e\u30c7\u30e2\u52d5\u753b\u304c\u4ee5\u4e0b\u3067\u3059\u3002<\/p>\n\n\n\n<p><video controls=\"\" src=\"https:\/\/is-ai.jp\/wp-content\/uploads\/2022\/04\/output.mp4\"><\\video><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u753b\u50cf\u306e\u4e00\u90e8\u3092\u5207\u308a\u53d6\u3063\u3066\u3001\u93e1\u306b\u898b\u7acb\u3066\u3066\u8907\u88fd\u3057\u3066\u3044\u304d\u307e\u3059\u3002\u8907\u88fd\u306fopencv\u306e\u95a2\u6570\u3067\u3042\u308b\u3001\u30d5\u30ea\u30c3\u30d7\u3068\u30b9\u30bf\u30c3\u30af\u3067\u304a\u3053\u306a\u3063\u3066\u3044\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u4eca\u56de\u30c7\u30e2\u306b\u4f7f\u7528\u3057\u305f\u5143\u753b\u50cf\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"597\" height=\"597\" src=\"https:\/\/is-ai.jp\/wp-content\/uploads\/2022\/04\/liver.png\" alt=\"\" class=\"wp-image-279\" srcset=\"https:\/\/is-ai.jp\/wp-content\/uploads\/2022\/04\/liver.png 597w, https:\/\/is-ai.jp\/wp-content\/uploads\/2022\/04\/liver-300x300.png 300w, https:\/\/is-ai.jp\/wp-content\/uploads\/2022\/04\/liver-150x150.png 150w\" sizes=\"(max-width: 597px) 100vw, 597px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Code<\/h4>\n\n\n\n<p>\u4f5c\u6210\u3057\u305f\u30b3\u30fc\u30c9\u306f\u3053\u3061\u3089\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>\nimport cv2\nimport numpy as np\nimport time\n\nclass Kaleidoscope():\n    def __init__(self, image, rotate=0):\n        self.h, self.w, _ = image.shape\n        self.crop_size = (self.h\/\/2, self.w\/\/2)\n\n        self.rotate = rotate\n        self.image = image\n        self.croped_image = image\n        self.kaleidoscope_img = None\n\n        # initialize position\n        self.top = np.random.randint(0, self.h - self.crop_size[0])\n        self.left = np.random.randint(0, self.w - self.crop_size[1])\n\n    def random_crop(self):\n        # set bottom, right\n        bottom = self.top + self.crop_size[0]\n        right = self.left + self.crop_size[1]\n\n        # generate croped img\n        self.croped_image = self.image[self.top:bottom, self.left:right, :]\n        self.croped_image = cv2.resize(self.croped_image, dsize=(self.h, self.w))\n\n    def generate_kaleidoscope(self):\n        # transpose the image\n        imgt = cv2.transpose(self.croped_image)\n\n        # create diagonal bi-tonal mask\n        mask = np.zeros((self.w, self.h), dtype=np.uint8)\n        points = np.array([[[0,0], [self.w,0], [self.w,self.h]]])\n        cv2.fillPoly(mask, points, 255)\n\n        # composite img and imgt using mask\n        compA = cv2.bitwise_and(imgt, imgt, mask=mask)\n        compB = cv2.bitwise_and(self.croped_image, self.croped_image, mask=255-mask)\n        comp = cv2.add(compA, compB)\n\n        # rotate -&gt; flip -&gt; concat -&gt; flip -&gt; concat -&gt; resize\n        comp = self.set_rotate(comp)\n        mirror = cv2.flip(comp, 1)\n        top = np.hstack((comp, mirror))\n        bottom = cv2.flip(top, 0)\n        kaleidoscope_big = np.vstack((top, bottom))\n        self.kaleidoscope_img = cv2.resize(kaleidoscope_big, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)\n\n    def update(self):\n        r = np.random.randint(0,1)\n        if r == 0:\n            self.top += 1\n        else:\n            self.left += 1\n\n        # reset \n        if self.top &gt; self.h-self.crop_size[0] or self.left &gt; self.w-self.crop_size[1]:\n            self.top = np.random.randint(0, self.h - self.crop_size[0])\n            self.left = np.random.randint(0, self.w - self.crop_size[1])\n\n        self.random_crop()\n        self.generate_kaleidoscope()\n\n        return self.kaleidoscope_img\n\n    def set_rotate(self, comp):\n        if self.rotate == 90:\n            comp = cv2.rotate(comp,cv2.ROTATE_90_CLOCKWISE)\n        elif self.rotate == 180:\n            comp = cv2.rotate(comp,cv2.ROTATE_180)\n        elif self.rotate == 270:\n            comp = cv2.rotate(comp,cv2.ROTATE_90_COUNTERCLOCKWISE)\n\n        return comp\n\ndef main():\n    img = cv2.imread(&#39;liver.png&#39;)\n    myKaleidoscope = Kaleidoscope(img)\n\n    while True:\n        kaleidoscope = myKaleidoscope.update()\n        time.sleep(0.03)\n\n        cv2.imshow(&#39;kaleidoscope&#39;, kaleidoscope)\n        if cv2.waitKey(1) & 0xFF == ord(&#39;q&#39;):\n            break\n\n    cv2.destroyWindow(&#39;kaleidoscope&#39;)\n\nif __name__ == &quot;__main__&quot;:\n    main()\n<\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u304a\u308f\u308a\u306b<\/h4>\n\n\n\n<p>\u4e07\u83ef\u93e1\u306f\u7c21\u5358\u306a\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u5272\u306b\u898b\u6804\u3048\u304c\u3068\u3066\u3082\u7dba\u9e97\u3067\u3059\u3088\u306d\u3002\u8abf\u3079\u3066\u3082\u305d\u308c\u3089\u3057\u3044\u30b3\u30fc\u30c9\u304c\u898b\u3064\u304b\u3089\u306a\u304b\u3063\u305f\u306e\u3067\u3001\u81ea\u4f5c\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u3053\u308c\u3092\u4f7f\u3063\u305f\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u7cfb\u306e\u4f5c\u54c1\u3068\u304b\u3082\u3067\u304d\u305f\u3089\u9762\u767d\u305d\u3046\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u306f\u3058\u3081\u306b python\u3067\u4e07\u83ef\u93e1\uff08\u306e\u3088\u3046\u306a\u52d5\u4f5c\u3092\u3059\u308b\uff09\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u307e\u3057\u305f\u3002\u5b8c\u6210\u7269\u306e\u30c7\u30e2\u52d5\u753b\u304c\u4ee5\u4e0b\u3067\u3059\u3002 \u753b\u50cf\u306e\u4e00\u90e8\u3092\u5207\u308a\u53d6\u3063\u3066\u3001\u93e1\u306b\u898b\u7acb\u3066\u3066\u8907\u88fd\u3057\u3066\u3044\u304d\u307e\u3059\u3002\u8907\u88fd\u306fopencv\u306e\u95a2\u6570\u3067\u3042\u308b\u3001\u30d5\u30ea\u30c3\u30d7\u3068\u30b9\u30bf\u30c3\u30af\u3067\u304a\u3053\u306a\u2026<\/p>\n","protected":false},"author":1,"featured_media":278,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[7,17],"_links":{"self":[{"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/posts\/276"}],"collection":[{"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/is-ai.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=276"}],"version-history":[{"count":11,"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/posts\/276\/revisions"}],"predecessor-version":[{"id":329,"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/posts\/276\/revisions\/329"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/is-ai.jp\/index.php?rest_route=\/wp\/v2\/media\/278"}],"wp:attachment":[{"href":"https:\/\/is-ai.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/is-ai.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/is-ai.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}