日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像处理------图像细化

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理------图像细化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖像處理------圖像細化

算法流程參考自:圖像處理細化算法
參考博文中沒有細化算法的代碼實現(xiàn),只有算法的具體流程,在本文中,使用python實現(xiàn)圖像細化的代碼實現(xiàn),但其運行效率沒有考慮,只為理解算法原理:

算法原理步驟

對二值圖像進行細化,就是骨架提取,刪除不需要的輪廓點,保留其骨架點。假設(shè)一個像素點,該點為p1,八鄰域為p2->p9,通過考慮P1鄰域的實際情況,以便決定是否刪除P1點。假設(shè)處理的圖像為二值圖形,背景為黑色0,細化的前景為1.

算法流程,分為兩步,每步判斷四個條件,然后決定像素點的去留。

第一步

1.條件1: 2<=P2+P3+P3+P4+P5+P6+P7+P8+P9 <=6
大于2保證P1不是斷電和孤立點,小于6保證P1是一個邊界點,等于0時周圍沒有等于1的像素,P1為孤立點,等于1時周圍只有一個等于1的像素,多以P1為端點。(是端點的條件,周圍有且只能有一個值為1的像素)
2.P2->P9的排列順序,如上圖的排列順序,01模式的數(shù)量為1,如下圖P2P3,P6P7所以改像素的01模式數(shù)量為2.
保證01模式數(shù)量為1,是要保證刪除當(dāng)前像素點后的連通性。

3.P2P4P6 = 0
4.P4P6P8=0
第一步之后會如果四條全部滿足則令P1=0,否則保持不變。第一步之后會刪除右下角的邊界點。

第二步

對第一步操作后的圖像,執(zhí)行第二步操作:
1.條件1: 2<=P2+P3+P3+P4+P5+P6+P7+P8+P9 <=6
2.P2->P9的排列順序,如上圖的排列順序,01模式的數(shù)量為1,如下圖P2P3,P6P7所以改像素的01模式數(shù)量為2.
保證01模式數(shù)量為1,是要保證刪除當(dāng)前像素點后的連通性。
3.P2P4P8 = 0
4.P2P6P8=0
第二步執(zhí)行之后會刪除左上的邊界點。

執(zhí)行完上述的兩個步驟,就完成了一次細化操作,可以通過多次迭代執(zhí)行,得到最終的骨架圖

算法代碼實現(xiàn)

主要使用python實現(xiàn)上述的細化流程,封裝成為一個函數(shù)。
在代碼中主要按照第一步的實現(xiàn)來說,第二步和第一步的實現(xiàn)幾乎完全相同

for row in range(h-1):for col in range(w-1):if img[row][col] == 1:flag = 0#條件1t = img[row-1][col-1] + img[row-1][col] + img[row-1][col+1] + img[row][col-1] + img[row][col+1]+ img[row+1][col-1] + img[row+1][col] + img[row+1][col+1]if t >= 2 and t <= 6:flag += 1#條件2t = 0lis = [img[row-1][col],img[row-1][col+1],img[row][col+1],img[row+1][col+1],img[row+1][col],img[row+1][col-1],img[row][col-1],img[row-1][col-1],img[row-1][col]]for i in range(len(lis)-1):if lis[i] == 0 and lis[i+1] ==1:t += 1if t == 1:flag += 1#條件3s = img[row-1][col] * img[row][col+1] * img[row+1][col]if s == 0:flag += 1#條件4s = img[row][col+1] * img[row+1][col] * img[row][col-1]if s == 0:flag += 1if flag == 4:dst[row][col] = 0

首先,我們判斷當(dāng)前像素值是否為1,如果是再進行以下的四個條件判斷,如果不是這直接跳過。
在之前,沒有進行這行代碼,我迭代6次花費的時間是現(xiàn)在的很多倍
判斷成立后設(shè)立一個flag用來記錄條件成立的個數(shù)。
下面就是四個條件的分別判斷了,
第一個條件,相對來說比較簡單,看一下代碼都會懂的。

t = img[row-1][col-1] + img[row-1][col] + img[row-1][col+1] + img[row][col-1] + img[row][col+1]+ img[row+1][col-1] + img[row+1][col] + img[row+1][col+1]if t >= 2 and t <= 6:flag += 1

第二個條件是四個條件中比較有難度的
編寫思路:將P2->P9放置在列表中,通過遍歷列表來發(fā)現(xiàn)01模式,需要注意的是不要忽略在P9P2可能存在的01模式,所以在列表的最后又加了P2點,

#條件2 t = 0 lis = [img[row-1][col],img[row-1][col+1],img[row][col+1],img[row+1][col+1],img[row+1][col],img[row+1] [col-1],img[row][col-1],img[row-1][col-1],img[row-1][col]] for i in range(len(lis)-1):if lis[i] == 0 and lis[i+1] ==1:t += 1 if t == 1:flag += 1

對于條件三和四,就不需要贅述了。
下面是細化函數(shù)的完整形式:

def xihua(img):h,w = img.shapedst = img.copy()for row in range(h-1):for col in range(w-1):if img[row][col] == 1:flag = 0#條件1t = img[row-1][col-1] + img[row-1][col] + img[row-1][col+1] + img[row][col-1] + img[row][col+1]+ img[row+1][col-1] + img[row+1][col] + img[row+1][col+1]if t >= 2 and t <= 6:flag += 1#條件2t = 0lis = [img[row-1][col],img[row-1][col+1],img[row][col+1],img[row+1][col+1],img[row+1][col],img[row+1][col-1],img[row][col-1],img[row-1][col-1],img[row-1][col]]for i in range(len(lis)-1):if lis[i] == 0 and lis[i+1] ==1:t += 1if t == 1:flag += 1#條件3s = img[row-1][col] * img[row][col+1] * img[row+1][col]if s == 0:flag += 1#條件4s = img[row][col+1] * img[row+1][col] * img[row][col-1]if s == 0:flag += 1if flag == 4:dst[row][col] = 0temp = dst.copy()for row in range(h-1):for col in range(w-1):if dst[row][col] == 1:flag = 0# 條件1t = dst[row - 1][col - 1] + dst[row - 1][col] + dst[row - 1][col + 1] + dst[row][col - 1] + dst[row][col + 1]+ dst[row + 1][col - 1] + dst[row + 1][col] + dst[row + 1][col + 1]if t >= 2 and t <= 6:flag += 1# 條件2t = 0lis = [dst[row - 1][col], dst[row - 1][col + 1], dst[row][col + 1], dst[row + 1][col + 1],dst[row + 1][col], dst[row + 1][col - 1], dst[row][col - 1], dst[row - 1][col - 1],dst[row - 1][col]]for i in range(len(lis) - 1):if lis[i] == 0 and lis[i + 1] == 1:t += 1if t == 1:flag += 1# 條件3s = dst[row - 1][col] * dst[row][col + 1] * dst[row + 1][col]if s == 0:flag += 1# 條件4s = dst[row][col + 1] * dst[row + 1][col] * dst[row][col - 1]if s == 0:flag += 1if flag == 4:temp[row][col] = 0return temp

在最后我對添加優(yōu)化和未優(yōu)化的時間做了一下對比:

t = time.time() xihua_low(imgb) print('未優(yōu)化:',time.time()-t)t = time.time() xihua(imgb) print('優(yōu)化后:',time.time()-t)

輸出的結(jié)果為:

總結(jié)

以上是生活随笔為你收集整理的图像处理------图像细化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。