乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      python-PySide:分離一個spritesheet /分離圖像成連續(xù)的顏色區(qū)域

       印度阿三17 2019-10-31

      我正在開發(fā)一個程序,在該程序中我需要分離精靈表,或者換句話說,將圖像分離成連續(xù)的顏色區(qū)域.

      我以前從未做過任何圖像處理,所以我想知道如何處理.測試像素顏色后該怎么辦?確定每個子畫面帶哪個像素的最佳方法是什么?

      所有輸入圖像均具有統(tǒng)一的背景,并且與背景不同的Alpha通道被視為顏色.輸出圖像的順序需要左右,上下.我的項(xiàng)目是用PySide編寫的,因此我也希望將其用于此任務(wù),但是如果需要,我可以導(dǎo)入更多的庫.

      感謝您的答復(fù)!

      附言:
      我不確定PySide標(biāo)簽是否合適,因?yàn)槲艺谑褂肞ySide,但問題不涉及它的GUI方面.如果mod認(rèn)為它不屬于該對象,請隨時將其刪除.

      例如,我有一個如下所示的Spritesheet:

      我想將其分為以下幾類:

      解決方法:

      這聽起來像應(yīng)該在處理sprite的任何事物中實(shí)現(xiàn),但是在這里我們將實(shí)現(xiàn)自己的sprite-spliter.

      我們這里需要的第一件事是提取單個對象.在這種情況下,僅需確定像素是否為背景.如果我們假設(shè)原點(diǎn)是背景像素,則可以完成以下操作:

      from PIL import Image
      
      def sprite_mask(img, bg_point=(0, 0)):
          width, height = img.size
          im = img.load()
      
          bg = im[bg_point]
          mask_img = Image.new('L', img.size)
          mask = mask_img.load()
          for x in xrange(width):
              for y in xrange(height):
                  if im[x, y] != bg:
                      mask[x, y] = 255
          return mask_img, bg

      如果您保存上面創(chuàng)建的遮罩圖像并將其打開,這就是您要看到的圖像(我在空窗口內(nèi)添加了一個矩形):

      在上面的圖像中,如果我們要加入其他內(nèi)部的精靈(例如添加的矩形,請參見上圖),接下來需要填充它的孔.這是另一條簡單的規(guī)則:如果無法從[0,0]處的點(diǎn)到達(dá)某個點(diǎn),則它是一個孔,必須將其填充.然后剩下的就是將每個精靈分離成單獨(dú)的圖像.這是通過連接的組件標(biāo)簽完成的.對于每個組件,我們得到其軸對齊的邊界框以定義零件的尺寸,然后從原始圖像中復(fù)制屬于給定組件的點(diǎn).為了簡短起見,以下代碼對這些任務(wù)使用scipy:

      import sys
      import numpy
      from scipy.ndimage import label, morphology
      
      def split_sprite(img, mask, bg, join_interior=True, basename='sprite_%d.png'):
          im = img.load()
      
          m = numpy.array(mask, dtype=numpy.uint8)
          if join_interior:
              m = morphology.binary_fill_holes(m)
          lbl, ncc = label(m, numpy.ones((3, 3)))
      
          for i in xrange(1, ncc   1):
              px, py = numpy.nonzero(lbl == i)
              xmin, xmax, ymin, ymax = px.min(), px.max(), py.min(), py.max()
      
              sprite = Image.new(img.mode, (ymax - ymin   1, xmax - xmin   1), bg)
              sp = sprite.load()
              for x, y in zip(px, py):
                  x, y = int(x), int(y)
                  sp[y - int(ymin), x - int(xmin)] = im[y, x]
      
              name = basename % i
              sprite.save(name)
              print "Wrote %s" % name
      
      sprite = Image.open(sys.argv[1])
      mask, bg = sprite_mask(sprite)
      split_sprite(sprite, mask, bg)

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約