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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

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

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

圖像處理------圖像細(xì)化

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

算法原理步驟

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

算法流程,分為兩步,每步判斷四個(gè)條件,然后決定像素點(diǎn)的去留。

第一步

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

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

第二步

對(duì)第一步操作后的圖像,執(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)前像素點(diǎn)后的連通性。
3.P2P4P8 = 0
4.P2P6P8=0
第二步執(zhí)行之后會(huì)刪除左上的邊界點(diǎn)。

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

算法代碼實(shí)現(xiàn)

主要使用python實(shí)現(xiàn)上述的細(xì)化流程,封裝成為一個(gè)函數(shù)。
在代碼中主要按照第一步的實(shí)現(xiàn)來(lái)說(shuō),第二步和第一步的實(shí)現(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,如果是再進(jìn)行以下的四個(gè)條件判斷,如果不是這直接跳過(guò)。
在之前,沒(méi)有進(jìn)行這行代碼,我迭代6次花費(fèi)的時(shí)間是現(xiàn)在的很多倍
判斷成立后設(shè)立一個(gè)flag用來(lái)記錄條件成立的個(gè)數(shù)。
下面就是四個(gè)條件的分別判斷了,
第一個(gè)條件,相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,看一下代碼都會(huì)懂的。

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

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

#條件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

對(duì)于條件三和四,就不需要贅述了。
下面是細(xì)化函數(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

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

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é)

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

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