การนับจำนวนกลุ่ม 1s ในแผนที่บูลีนของ numpy.array


16

ตอนนี้ฉันกำลังจัดการกับการประมวลผลภาพใน Python ผ่าน PIL (Python Image Library) เป้าหมายหลักของฉันคือการนับจำนวนเซลล์สีในภาพอิมมูโนวิทยา ฉันรู้ว่ามีโปรแกรมห้องสมุดฟังก์ชั่นและบทแนะนำที่เกี่ยวข้องและฉันตรวจสอบเกือบทั้งหมด เป้าหมายหลักของฉันคือการเขียนโค้ดด้วยตนเองตั้งแต่เริ่มต้นให้มากที่สุด ดังนั้นฉันพยายามหลีกเลี่ยงการใช้ไลบรารีและฟังก์ชันภายนอกมากมาย ฉันเขียนโปรแกรมส่วนใหญ่แล้ว ดังนั้นนี่คือสิ่งที่เกิดขึ้นทีละขั้นตอน:

โปรแกรมใช้เวลาในไฟล์ภาพ:ตัวอย่าง

และประมวลผลสำหรับเซลล์สีแดง (โดยทั่วไปแล้วจะปิดค่า RGB ต่ำกว่าเกณฑ์ที่กำหนดสำหรับสีแดง): ป้อนคำอธิบายรูปภาพที่นี่

และสร้างแผนที่บูลีนของมัน (จะวางส่วนหนึ่งของมันเพราะมันใหญ่) ซึ่งโดยทั่วไปแล้วจะวาง 1 ทุกที่ที่มันพบกับพิกเซลสีแดงในภาพที่สองที่ประมวลผลข้างต้น

22222222222222222222222222222222222222222
20000000111111110000000000000000000000002
20000000111111110000000000000000000000002
20000000111111110000000000000000000000002
20000000011111100000000000000000001100002
20000000001111100000000000000000011111002
20000000000110000000000000000000011111002
20000000000000000000000000000000111111002
20000000000000000000000000000000111111102
20000000000000000000000000000001111111102
20000000000000000000000000000001111111102
20000000000000000000000000000000111111002
20000000000000000000000000000000010000002
20000000000000000000000000000000000000002
22222222222222222222222222222222222222222

ฉันตั้งใจสร้างเฟรมนั้นคล้าย ๆ กับเส้นขอบด้วย 2s เพื่อช่วยฉันในการนับจำนวนกลุ่ม 1s ในแผนที่บูลีนนั้น

คำถามของฉันสำหรับพวกคุณคือทำไมฉันจะนับจำนวนเซลล์ (กลุ่ม 1s) ได้อย่างมีประสิทธิภาพในแผนที่บูลีนแบบนั้น? ฉันพบhttp://en.wikipedia.org/wiki/Connected-component_labelingซึ่งดูมีความเกี่ยวข้องและคล้ายคลึงกันมาก แต่เท่าที่ฉันเห็นมันอยู่ในระดับพิกเซล ของฉันอยู่ในระดับบูลีน เพียง 1 และ 0

ขอบคุณมาก.


การติดฉลากส่วนประกอบที่เชื่อมต่อเป็นสิ่งที่คุณต้องการ ฉันไม่รู้ว่าทำไมคุณถึงคิดว่ามันแตกต่างกันเนื่องจากบทความ Wikipedia มีตัวอย่างที่เริ่มต้นด้วยอาร์เรย์ 1s และ 0s

ฉันรู้ว่ามันคล้ายกัน (หรืออาจจะเหมือนกัน) ฉันไม่สามารถเข้าใจหน้าวิกิพีเดียได้อย่างเต็มที่เนื่องจากภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน ส่วน "อัลกอริธึมตามลำดับ" ของหน้าดูเหมือนว่าจะจัดการกับ 1 และ 0 แต่ฉันก็ยังไม่เห็นตรรกะที่อยู่ด้านหลัง ฟอเร็กซ์ทำไมถึงเริ่มต้นด้วยการตรวจสอบทิศเหนือทิศตะวันออกเฉียงเหนือทิศตะวันตกเฉียงเหนือและทิศตะวันตก

ปัญหานี้ได้รับการแก้ไข

จะเกิดอะไรขึ้นถ้าเซลล์ที่สนใจซ้อนทับกัน คุณไม่ควรมองหาคุณสมบัติแบบวงกลมโดยเฉพาะเพื่อให้คุณสามารถแยกความแตกต่างของเซลล์สองเซลล์ที่ดูเชื่อมโยงกันได้
endolith

สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นเมื่อภาพอิมมูโนวิทยาที่คุณมีคุณภาพไม่ดีในแง่ของจำนวนเซลล์ที่ทับซ้อนกันความละเอียดการเบี่ยงเบนมาตรฐานของค่าพิกเซลดังนั้นและป้อม ... ฉันพยายามเขียนโปรแกรมเล็ก ๆ ที่ใช้งานได้ ดีสำหรับวัตถุประสงค์ดังกล่าว แต่ดูเหมือนว่าภาพที่นำเข้าและเงื่อนไขของมันมีความสำคัญมากเพื่อให้ได้ผลลัพธ์ที่สมบูรณ์แบบ ..
อิบราฮิมซีเคิร์ต

คำตอบ:


6

บางสิ่งบางอย่างของวิธีการที่กำลังดุร้าย แต่ทำโดยการย้อนกลับปัญหาในการจัดทำดัชนีเหนือคอลเลกชันของพิกเซลเพื่อค้นหาพื้นที่แทนที่จะเป็น rasterizing เหนืออาร์เรย์

data = """\
000000011111111000000000000000000000000
000000011111111000000000000000000000000
000000011111111000000000000000000000000
000000001111110000000001000000000110000
000000000111110000000011000000001111100
000000000011100000000000100000011111100
000000000000000000000000000000011111100
000000000000000000000000000000011111110
000000000000000000000000000000111111110
000000000000000000000000000000111111110
000000000000000000000000000000011111100
000000000000000000000000000000001000000
000000000000000000000000000000000000000"""

from collections import namedtuple
Point = namedtuple('Point', 'x y')

def points_adjoin(p1, p2):
    # to accept diagonal adjacency, use this form
    #return -1 <= p1.x-p2.x <= 1 and -1 <= p1.y-p2.y <= 1
    return (-1 <= p1.x-p2.x <= 1 and p1.y == p2.y or
             p1.x == p2.x and -1 <= p1.y-p2.y <= 1)

def adjoins(pts, pt):
    return any(points_adjoin(p,pt) for p in pts)

def locate_regions(datastring):
    data = map(list, datastring.splitlines())
    regions = []
    datapts = [Point(x,y) 
                for y,row in enumerate(data) 
                    for x,value in enumerate(row) if value=='1']
    for dp in datapts:
        # find all adjoining regions
        adjregs = [r for r in regions if adjoins(r,dp)]
        if adjregs:
            adjregs[0].add(dp)
            if len(adjregs) > 1:
                # joining more than one reg, merge
                regions[:] = [r for r in regions if r not in adjregs]
                regions.append(reduce(set.union, adjregs))
        else:
            # not adjoining any, start a new region
            regions.append(set([dp]))
    return regions

def region_index(regs, p):
    return next((i for i,reg in enumerate(regs) if p in reg), -1)

def print_regions(regs):
    maxx = max(p.x for r in regs for p in r)
    maxy = max(p.y for r in regs for p in r)
    allregionpts = reduce(set.union, regs)
    for y in range(-1,maxy+2):
        line = []
        for x in range(-1,maxx+2):
            p = Point(x, y)
            if p in allregionpts:
                line.append(str(region_index(regs, p)))
            else:
                line.append('.')
        print ''.join(line)
    print


# test against data set
regs = locate_regions(data)
print len(regs)
print_regions(regs)

พิมพ์:

4
........................................
........00000000........................
........00000000........................
........00000000........................
.........000000.........1.........33....
..........00000........11........33333..
...........000...........2......333333..
................................333333..
................................3333333.
...............................33333333.
...............................33333333.
................................333333..
.................................3......
........................................

ว้าว ... ฉันไม่รู้จะพูดยังไงดี เด็ดมาก และใช้งานได้อย่างสมบูรณ์ ขอบคุณพอล

งานนี้มากเหลือเกินเมื่อมีฟังก์ชั่นในScipyการทำสิ่งนี้อยู่แล้วซึ่งอาจเร็วกว่านี้ด้วย ^^ 'แต่อาจเป็นการออกกำลังกายที่ดีอยู่แล้วและมันแสดงให้เห็นถึงวิธีการทำสิ่งนี้โดยทั่วไป ฉันจะลงคะแนนแล้ว
Zelphir Kaltstahl

13

คุณสามารถใช้ndimage.labelซึ่งเป็นวิธีที่ดีในการทำเช่นนี้ มันส่งกลับอาร์เรย์ใหม่ที่มีคุณสมบัติทุกอย่างมีค่าที่ไม่ซ้ำกันและจำนวนของคุณสมบัติ คุณยังสามารถระบุองค์ประกอบการเชื่อมต่อ

import scipy
from scipy import ndimage
import matplotlib.pyplot as plt

#flatten to make greyscale, using your second red-black image as input.
im = scipy.misc.imread('blobs.jpg',flatten=1)
#smooth and threshold as image has compression artifacts (jpg)
im = ndimage.gaussian_filter(im, 2)
im[im<10]=0
blobs, number_of_blobs = ndimage.label(im)
print 'Number of blobls:', number_of_blobs

plt.imshow(blobs)
plt.show()

#Output is:
Number of blobls: 30

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณ fraxel ทั้งหมดนี้ทำงานได้อย่างรวดเร็วและสกปรก แต่บางทีฉันควรปรับปรุงคุณภาพของภาพเพราะคุณเห็นว่ามีเซลล์ที่รวมเป็นจำนวนมาก คำตอบควรเป็น 30 เซลล์ ขอบคุณมากอีกครั้ง (แก้ไข: ฉันพยายามปรับปรุงคุณภาพความละเอียดของภาพแล้วลบด้วยรหัสของคุณ แต่ยังคงผสานเซลล์จำนวนมากต้องเป็นวิธีที่แบน = 1 หรือ imread ทำงานอย่างไร)

1
@Ibrahim C. Kurt - ฉันได้อัปเดตเพื่อแก้ไขให้ถูกต้องแล้ว (ฉันเพิ่งสังเกตเห็น!) ปัญหาคือภาพที่อัปโหลดเป็น jpg ดังนั้นจึงมีสิ่งประดิษฐ์มากมาย จำนวนเล็ก ๆ ของการปรับให้เรียบและ Thresholding แก้ไขว่า .. ควรจะทำงานที่ดีเลิศสำหรับ png ภาพ (ฉันคิดว่า ... )

โดยไม่จำเป็นต้องปรับให้เรียบและ thresholding

มันใช้งานได้ทั้งหมด คุณพูดถูก หากไม่จำเป็นต้องแก้ไขเพิ่มเติมใด ๆ เพียงแค่เปลี่ยนเป็น png จาก jpg ก็เพียงพอแล้ว ขอบคุณมาก ๆ. ฉันมีคำตอบที่สมบูรณ์แบบมากกว่า 2 ข้อในขณะนี้ ฉันไม่รู้จะทำอย่างไรและพูดว่า: D

@Ibrahim C. Kurt - โชคดีคุณ;)

6

นี่คืออัลกอริทึมที่ O (จำนวนพิกเซลทั้งหมด + จำนวนพิกเซลของเซลล์) เราเพียงแค่สแกนภาพเพื่อหาพิกเซลของเซลล์และเมื่อเราพบภาพหนึ่งเราก็เติมเต็มเซลล์เพื่อลบออก

การนำไปใช้ใน Common LISP แต่คุณจะสามารถแปลเป็น Python ได้เล็กน้อย

(defun flood-fill (picture i j target-color replacement-color)
  ;; http://en.wikipedia.org/wiki/Flood_fill
  (when (= (aref picture i j) target-color)
    (setf (aref picture i j) replacement-color)
    (when (plusp i)
      (flood-fill picture (1- i) j target-color replacement-color))
    (when (< (1+ i) (array-dimension picture 0))
      (flood-fill picture (1+ i) j target-color replacement-color))
    (when (plusp j)
      (flood-fill picture i (1- j) target-color replacement-color))
    (when (< (1+ j) (array-dimension picture 1))
      (flood-fill picture i (1+ j) target-color replacement-color)))
  picture)


(defun count-cells (picture)
  (loop
    :with cell-count = 0
    :for i :from 0 :below (array-dimension picture 0)
    :do (loop
          :for j :from 0 :below (array-dimension picture 1)
          :unless (zerop (aref picture i j))
          :do (progn (incf cell-count)
                     (flood-fill picture i j 1 0)))
    :finally (return cell-count)))




(count-cells
  (make-array '(128 171) :element-type 'bit
              :initial-contents
              #(#171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000001110000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000000000011111100
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111000000000000000000000011111100
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111100
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110
                #171*000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111110
                #171*000000000011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111110
                #171*000000000011111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100
                #171*000000000011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
                #171*000000000001111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
                #171*000000000001111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
                #171*000000000000011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
                #171*000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111000000000000000000011
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111100000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111100000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111000000000000000000000111111110000000000000000000
                #171*000000000000000000111111000000000000000000000000000000000000000000000000000000111110000000000000000000000000000000000001111111100001111000000000011111110000000000000000000
                #171*000000000000000000111111100000000000000000000000000000000000000000000000000011111110000000000000000000000000000000000111111111100011111100000000011111100000000000000000000
                #171*000000000000000000111111100000000000000000000000000000000000000000000000000011111110000000000000000000000000000000000111111111110111111110000000000100000000000000000000000
                #171*000000000000000000111111100000000000000000000000000000000000000000000000000011111100000000000000000000000000000000000111111111110111111110000000000000000000000000000000000
                #171*000000000000000000111111100000000000000000000000000000000000000000000000000011111100000000000000000000000000000000000011111111100111111110000000000000000000000000000000000
                #171*000000000000000000111111100000000000000000000000000000000000000000000000000011111100000000000000000000000000000000000001111111100111111110000000000000000000000000000000000
                #171*000000000000000000011111100000000000000000000000000000000000000000000000000011111001110000000000000000000000000000000000011111000011111110000000000000000000000000000000000
                #171*000000000000000000010110000000000000000000000000000000000000000000000000000000000011111000000000000000000000000000000000000000000000111010000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000111100000000000000000000000
                #171*000000000000000000000000000000000000000000000111100000000000000000000000000000000000111100000000000000000000000000000000000000000000000000000011111111100000000000000000000
                #171*100000000000000000000000000000000000000000001111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000000000000000
                #171*111100000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000000000000000
                #171*111100000000000000000000000000000000000000011111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000000000000000
                #171*111100000000000000000000000000000000000000111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000000000000011
                #171*111100000000000000000000000000000000000000111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110000000000000000000111
                #171*111100000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111
                #171*000000000000000000000000000000000000000000011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
                #171*000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111100000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111100000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000001111111100000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111100000000000000000000000000000000000000000111111000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111100000000000000000000000000000000000000111110000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111100000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000011000000000000000000000000000000000000000000000000000001111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000001111100000000000000000000000000000000000000000000000000000111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000111111110000000000000000000000000000000000000000011111100000000000000000000000000000000000000000000000000111111000000000000000000000000000000000000000000000
                #171*000000000000000111111111000000000000000000000000000000000000000011111100000000000000000000000000000000000000000000000001111111100000000000000000000000000000000000000000000
                #171*000000000000000111111110000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000001111111100000000000000000000000000000000000000000000
                #171*000000000000000111111110000000000000000000000000000000000000001111111110000000000000000000000000000000000000000000000001111111110000000000000000001111111000000000000000000
                #171*000000000000000011111110000000000000000000000000000000000000001111111110000000000000000000000000000000000000000000000001111111110000000000000000011111111100000000000000000
                #171*000000000000000001110000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000011111100000000000000000011111111100000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000111111100000000000000000000000000000000000000000000000000001111000000000000000000011111111100000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000011111000000000000000000000000000000000000000000000000000000000000000000000000000011111111100000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111100000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111000000000000000000000000000000000000000000001111111000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111100000000000000000000000000000000000000000000100010000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000001111100000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000011111111110000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000011111111110000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000011111111110000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111111000000000000011111111110000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000011111110000000000000011111111100000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000001111100000000000000010111111100000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000001111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000011111111110000000000000000000000000000000000000011111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000011111111110000000000000000000000000000000000000111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000011111111110000000000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000001111111110000000000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000001111111000000000000000000000000000000000000001111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000000000000000000000000000000000011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000011111100000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000001111111110000000000000110000000000000000000000001111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000001111111110000000000001111100000000000000000000011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000001111111110000000000111111111000000000000000000011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000111111110000000000111111111000000000000000000111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000111111111000000000111111111100000000000000000111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000011111100001111000111111111100000000000000000111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000111111100111111111100000000000000000011111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000000111111100011111111100000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                #171*000000000000000000000000001111111100011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)))
--> 30

เฮ้ปาสกาลขอบคุณมากสำหรับการตอบกลับ ฉันเห็นว่าโปรแกรมของคุณพบคำตอบที่ถูกต้องอย่างหมดจด ปัญหาคือฉันไม่มีความคิดเกี่ยวกับภาษา Common LISP แต่ฉันจะลองหามันและเขียนสคริปต์ที่คล้ายกันใน Python

3

มีความคิดเห็นเพิ่มเติมมากกว่าคำตอบ:

ตามที่ @interjay ได้บอกใบ้ไว้แล้วในรูปแบบไบนารี่นั่นคือมีเพียง 2 สีเท่านั้นพิกเซลจะรับค่า 1 หรือ 0 ซึ่งอาจเป็นจริงหรือไม่จริงในรูปแบบการแสดงภาพที่คุณใช้ แต่เป็นจริง ในการนำเสนอ 'แนวคิด' ของรูปภาพของคุณ อย่าปล่อยให้รายละเอียดการใช้งานสร้างความสับสนให้คุณในเรื่องนี้ หนึ่งในรายละเอียดการติดตั้งคือการใช้งาน 2s รอบ ๆ ขอบของภาพซึ่งเป็นวิธีที่เหมาะสมที่สุดในการระบุโซนตายรอบ ๆ ภาพ แต่ไม่มีผลกระทบต่อคุณภาพของภาพไบนารี

สำหรับการตรวจสอบพิกเซล N, NE, NW และ W: สิ่งนี้เกี่ยวข้องกับการเชื่อมต่อของพิกเซลในการสร้างองค์ประกอบ แต่ละพิกเซล (แถบกรณีพิเศษของเส้นขอบ) มี 8 เพื่อนบ้าน (N, S, E, W, NE, NW, SE, SW) แต่พิกเซลใดที่เป็นตัวเลือกสำหรับการรวมไว้ในองค์ประกอบเดียวกัน บางครั้งส่วนประกอบที่พบเฉพาะที่มุม (NE, NW, SE, SW) ไม่ถือว่าเชื่อมต่ออยู่บางครั้งอาจเป็น

คุณต้องตัดสินใจเลือกสิ่งที่เหมาะสมกับใบสมัครของคุณ ฉันขอแนะนำให้คุณออกกำลังกายด้วยมือโดยใช้การดำเนินการบางอย่างของอัลกอริทึมแบบต่อเนื่องตรวจสอบเพื่อนบ้านที่แตกต่างกันสำหรับแต่ละพิกเซลเพื่อให้เข้าใจถึงสิ่งที่เกิดขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.