python---二值圖像連通域標記

一、圖像二值化

# 圖片二值化
from PIL import Image
img = Image.open('7.jpg')
 
# 模式L”爲灰色圖像,它的每個像素用8個bit表示,0表示黑,255表示白,其他數字表示不同的灰度。
Img = img.convert('L')
Img.save("test1.jpg")
 
# 自定義灰度界限,大於這個值爲黑色,小於這個值爲白色
threshold = 200
 
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
 
# 圖片二值化
photo = Img.point(table, '1')
photo.save("test2.jpg")

二、連通域標記
用區域生長法對連通域標記
在這裏插入圖片描述

# -*- coding: utf-8 -*-
from PIL import Image
import numpy as np


#定位一個種子,返回種子位置
def seed_dirt(img):
    for j in range(height):
        for i in range(width):
            a = img.getpixel((i,j))
            if a == 0:
                return((i,j))
    
#標記連通區域-4連通
def LableConnectedRagion4(labelmap,labelindex,quene):
    #flag = len(quene)
    while len(quene) !=0 :
        (m,n) = quene[0]
        quene.remove(quene[0])
        if img.getpixel((m,n+1)) == 0 and labelmap[n+1][m] == 0:
            quene.append((m,n+1))
            labelindex += 1
            labelmap[n+1][m] = 1
        if img.getpixel((m,n-1)) == 0 and labelmap[n-1][m] == 0:
            quene.append((m,n-1))
            labelindex += 1
            labelmap[n-1][m] = 1
        if img.getpixel((m+1,n)) == 0 and labelmap[n][m+1] == 0:
            quene.append((m+1,n))
            labelindex += 1
            labelmap[n][m+1] = 1   
        if img.getpixel((m-1,n)) == 0 and labelmap[n][m-1] == 0:
            quene.append((m-1,n))
            labelindex += 1
            labelmap[n][m-1] = 1
      

#標記連通區域-8連通
def LableConnectedRagion8(labelmap,labelindex,quene):
    #flag = len(quene)
    while len(quene) !=0 :
        (m,n) = quene[0]
        quene.remove(quene[0])
        # print(m,n)
        # print(quene)
        for i in range(-1,2):
            for j in range(-1,2):
                if img.getpixel((m+i,n+j)) == 0 and labelmap[n+j][m+i] == 0:
                    quene.append((m+i,n+j))
                    labelindex += 1
                    labelmap[n+j][m+i] = 1
                    


#匹配標記矩陣輸出第一個連通域圖片
def save_image(labelmap):
    for i in range(len(labelmap)):
        for j in range(len(labelmap[0])):
            if labelmap[i][j] != 0:
                newImg.putpixel((j,i),0)
    newImg.show()
    newImg.save("test3.jpg")
            
    
if __name__ =="__main__":
    img = Image.open('test2.jpg')
    img = img.convert('1')
    
    width = img.size[0]
    height = img.size[1]
    print(width,height)
    
    newImg = Image.new("1",(width,height),1)   #新建圖片newImg儲存兩圖片相加圖片
    
    labelmap = np.zeros((height,width))  #標記矩陣
    labelindex = 0                       #標記記數
    quene = []                           #存儲標記點位置信息
    
    (x,y) = seed_dirt(img)
    quene.append((x,y))
    labelindex += 1
    labelmap[y][x] = 1
    
    LableConnectedRagion4(labelmap,labelindex,quene)
    save_image(labelmap)
                
            
            
    

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章