NumPy实现迭代阈值

     步骤:

1. 自定义初始的分割阈值,一般情况下,初始分割阈值是图像灰度平均值T

2. 根据T图像分割为前景和背景,又分别算出前景和背景的平均灰度T1和T2

3. 计算新的阈值T3=(T1+T2)/2

4.如果T3==T,则迭代结束,T是最终阈值,否则令T=T3,走步骤2

代码实现:

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
def showImage(name,img):
    plt.imshow(img,cmap="gray")
    plt.title(name)
    plt.show()
def IterationThreshold(img):
    m=img.mean()

    #分割前景和背景
    while True:
        t1=img[img<m].mean()
        t2=img[img>=m].mean()

        t=(t1+t2)/2

        #如果新的阈值t==m,迭代结束
        if abs(m-t)<1:
            break;
        m=t
    #用阈值m进行二值化,把图像的前景和背景分隔开
    img2=np.where(img>=m,255,0)
    img2=img2.astype(np.uint8)
    return img2

if __name__=="__main__":
    img=cv.imread("../image/goldpig.jpg",0)
    img2=IterationThreshold(img)
    showImage("img",img)
    showImage("img2",img2)

运行结果:

   

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迭代阈值法是一种图像分割方法,用于将图像分为前景和背景。下面是一个使用Python实现的示例代码: ```python import cv2 import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm def diedai(img): img_array = np.array(img).astype(np.float32) # 转化成数组 I = img_array zmax = np.max(I) zmin = np.min(I) tk = (zmax + zmin) / 2 # 设置初始阈值 # 根据阈值将图像进行分割为前景和背景,分别求出两者的平均灰度 zo 和 zb b = 1 m, n = I.shape while b == 0: ifg = 0 ibg = 0 fnum = 0 bnum = 0 for i in range(1, m): for j in range(1, n): tmp = I[i, j] if tmp >= tk: ifg = ifg + 1 fnum = fnum + int(tmp) # 前景像素的个数以及像素值的总和 else: ibg = ibg + 1 bnum = bnum + int(tmp) # 背景像素的个数以及像素值的总和 # 计算前景和背景的平均值 zo 和 zb zo = int(fnum / ifg) zb = int(bnum / ibg) if tk == int((zo + zb) / 2): b = 0 else: tk = int((zo + zb) / 2) return tk img = cv2.imread("1.jpg") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) img = cv2.resize(gray, (200, 200)) yvzhi = diedai(img) ret1, th1 = cv2.threshold(img, yvzhi, 255, cv2.THRESH_BINARY) print(ret1) plt.imshow(th1, cmap=cm.gray) plt.show() ``` 这段代码使用了OpenCV和Matplotlib库。首先读取图像并进行灰度化处理,然后使用迭代阈值法确定阈值,并将图像分割为前景和背景。最后,通过阈值将图像二值化并显示出来。 希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值