基于Python的圖像閾值化分割(迭代法)
1.閾值化分割原理
通過(guò)對(duì)圖像的灰度直方圖進(jìn)行數(shù)學(xué)統(tǒng)計(jì),選擇一個(gè)或多個(gè)閾值將像素劃分為若干類。一般情況下,當(dāng)圖像由灰度值相差較大的目標(biāo)和背景組成時(shí),如果目標(biāo)區(qū)域內(nèi)部像素灰度分布均勻一致,背景區(qū)域像素在另一個(gè)灰度級(jí)上也分布均勻,這時(shí)圖像的灰度直方圖會(huì)呈現(xiàn)出雙峰特性。
在這種情況下,選取位于這兩個(gè)峰值中間的谷底對(duì)應(yīng)的灰度值T作為灰度閾值,將圖像中各個(gè)像素的灰度值與這個(gè)閾值進(jìn)行比較,根據(jù)比較的結(jié)果將圖像中的像素劃分到兩個(gè)類中。像素灰度值大于閾值T的像素點(diǎn)歸為一類,其余像素點(diǎn)歸為另一類。經(jīng)閾值化處理后的圖像g(x,y)定義為:

其中f(x,y)為原圖像,T為灰度閾值,g(x,y)為分割后產(chǎn)生的二值圖像。
2.算法流程圖

3.代碼實(shí)現(xiàn)
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
#讀入圖片并轉(zhuǎn)化為矩陣
img = plt.imread('2.jpg')
im = np.array(img)
# 矩陣大小
l = len(im)
w = len(im[0])
#求初始閾值
zmin = np.min(im)
zmax = np.max(im)
t0 = int((zmin+zmax)/2)
#初始化相關(guān)變量初始化
t1=0
res1=0
res2=0
s1=0
s2=0
#迭代法計(jì)算最佳閾值
while abs(t0-t1)>0:
for i in range(0,l-1):
for j in range(0,w-1):
if im[i,j]<t0:
res1=res1+im[i,j]
s1=s1+1
elif im[i,j]>t0:
res2=res2+im[i,j]
s2=s2+1
avg1=res1/s1
avg2=res2/s2
res1 = 0
res2 = 0
s1 = 0
s2 = 0
t1 = t0 #舊閾值儲(chǔ)存在t1中
t0=int((avg1+avg2)/2) #計(jì)算新閾值
#閾值化分割
#像素點(diǎn)灰度值小于最佳閾值t0用0填充,其余用255填充
im = np.where(im[...,:] < t0, 0, 255)
#繪制原圖窗口
plt.figure()
plt.imshow(img , cmap='gray')
plt.title('original')
#繪制原圖直方圖并顯示最佳閾值
plt.figure()
plt.hist(img.ravel(),256)
plt.title('hist')
plt.axvline(t0) #繪制最佳閾值分割線
plt.text(25, 6100, "Best Threshold:{}".format(t0), size = 15, alpha = 0.8)
#繪制閾值化分割后圖像
plt.figure()
plt.imshow(Image.fromarray(im) , cmap='gray')
plt.title('new')
#繪制閾值化分割后圖像的直方圖
plt.figure()
plt.hist(im.ravel(),256)
plt.title('hist')
plt.show()
4.閾值化分割結(jié)果
原始圖像

原始圖像直方圖

閾值化分割后圖像

閾值化分割后圖像直方圖

到此這篇關(guān)于基于Python的圖像閾值化分割(迭代法)的文章就介紹到這了,更多相關(guān)Python 圖像閾值化分割內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
超詳細(xì)注釋之OpenCV dlib實(shí)現(xiàn)人臉采集
這篇文章主要介紹了OpenCV dlib實(shí)現(xiàn)人臉采集,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
簡(jiǎn)單實(shí)例帶你了解Python的編譯和執(zhí)行全過(guò)程
python 是一種解釋型的編程語(yǔ)言,所以不像編譯型語(yǔ)言那樣需要顯式的編譯過(guò)程。然而,在 Python 代碼執(zhí)行之前,它需要被解釋器轉(zhuǎn)換成字節(jié)碼,這個(gè)過(guò)程就是 Python 的編譯過(guò)程,還不知道的朋友快來(lái)看看吧2023-04-04
Python進(jìn)階之高級(jí)用法詳細(xì)總結(jié)
今天帶各位小伙伴學(xué)習(xí)一下Python高級(jí)語(yǔ)法,主要有Lambda表達(dá)式,map函數(shù),filter函數(shù),reduce函數(shù),三大推導(dǎo)式等,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-05-05
使用keras實(shí)現(xiàn)非線性回歸(兩種加激活函數(shù)的方式)
這篇文章主要介紹了使用keras實(shí)現(xiàn)非線性回歸(兩種加激活函數(shù)的方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
詳解Python網(wǎng)絡(luò)框架Django和Scrapy安裝指南
這篇文章主要介紹了詳解Python網(wǎng)絡(luò)框架Django和Scrapy安裝指南,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
sublime3之內(nèi)網(wǎng)安裝python插件Anaconda的流程
這篇文章主要介紹了sublime3之內(nèi)網(wǎng)安裝python插件Anaconda的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Python 文件操作技巧(File operation) 實(shí)例代碼分析
python遍歷文件夾和文件 perl分割路徑和文件名2008-08-08

