全局閾值處理方法前提:當(dāng)物體和背景像素的灰度分布十分明顯時(shí),可以用適用于整個(gè)圖像的單個(gè)(全局)閾值。即可使用全局閾值處理。
算法思路:
(1)輸入原圖,轉(zhuǎn)化為灰度圖;
(2)對于灰度圖,為全局閾值T0選擇一個(gè)初始估計(jì)值(本人選擇為0~255中值127);
(3)迭代(4)(5)(6)(7)步驟,迭代次數(shù)可自行選擇;
(4)用T0分割灰度圖,將其分為兩組像素,G1由灰度值大于T0的所有像素組成,G2由所有小于T的所有像素組成;
(5)對G1和G2的像素分別計(jì)算平均灰度值m1和m2;
(6)計(jì)算一個(gè)新的閾值:T1=1/2(m1+m2);
(7)如果T1-T0=0,則為二值圖閾值,否則繼續(xù)迭代。
代碼如下:
import cv2 as cv
import numpy as np
# 轉(zhuǎn)灰
def rgb2gray(img):
h=img.shape[0]
w=img.shape[1]
img1=np.zeros((h,w),np.uint8)
for i in range(h):
for j in range(w):
img1[i,j]=0.144*img[i,j,0]+0.587*img[i,j,1]+0.299*img[i,j,2]
return img1
# 計(jì)算新閾值
def threshold(img,T):
h=img.shape[0]
w=img.shape[1]
G1=G2=0
g1=g2=0
for i in range (h):
for j in range (w):
if img[i,j]>T:
G1+=img[i,j]
g1+=1
else:
G2+=img[i,j]
g2+=1
m1=int(G1/g1)
m2=int(G2/g2) # m1,m2計(jì)算兩組像素均值
T0=int((m1+m2)/2) # 據(jù)公式計(jì)算新的閾值
return T0
def decide(img,T):
h=img.shape[0]
w=img.shape[1]
img1=np.zeros((h,w),np.uint8)
T0=T
T1=threshold(img,T0)
for k in range (100): # 迭代次數(shù)為經(jīng)驗(yàn)值,可據(jù)實(shí)際情況選定
if abs(T1-T0)==0: # 若新閾值減舊閾值差值為零,則為二值圖最佳閾值
for i in range (h):
for j in range (w):
if img[i,j]>T1:
img1[i,j]=255
else:
img1[i,j]=0
break
else:
T2=threshold(img,T1)
T0=T1
T1=T2 # 變量轉(zhuǎn)換,保證if條件為新閾值減舊閾值
return img1
image=cv.imread("D:/Testdata/grow.tif")
grayimage=rgb2gray(image)
thresholdimage=decide(grayimage,127)
cv.imshow("image",image)
cv.imshow("grayimage",grayimage)
cv.imshow("thresholdimage",thresholdimage)
cv.waitKey(0)
cv.destroyAllWindows()
實(shí)驗(yàn)結(jié)果:
左圖為原圖,右圖為灰度圖
此方法為最基本二值化圖像方法,在實(shí)際應(yīng)用中會從在諸多不足,但確是閾值分割的基礎(chǔ),需要了解掌握。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
