ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图像识别-OSTU阈值分割

2022-03-07 20:04:20  阅读:166  来源: 互联网

标签:cdf plt 图像识别 阈值 img cv2 flatten print OSTU


原理方面,其他网友已经讲得很详细了,这里补充下python代码
https://blog.csdn.net/liyuanbhu/article/details/49387483

点击查看代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# ICV=PA∗(MA−M)2+PB∗(MB−M)2
# 每一个阈值将整个直方图分割成两部分
# 两部分各自的平均值成为 MA 和 MB
# A 部分里的像素数占总像素数的比例记作 PA,B部分里的像素数占总像素数的比例记作 PB。
# 整体图片的灰度值的均值为 M。
img = cv2.imread('ostu.jpg', 0)
# flatten() 将数组变成一维
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# 计算累积分布图
cdf = hist.cumsum()

cdf_normalized = cdf * hist.max() / cdf.max()
# 可以看下直方图
# plt.plot(cdf_normalized, color='b')
# plt.hist(img.flatten(), 256, [0, 256], color='r')
# plt.xlim([0, 256])
# plt.legend(('cdf', 'histogram'), loc='upper left')
# plt.show()

M = img.flatten().mean()
print(M)
n = img.flatten()
print(n.shape)

M = n.mean()
print(n.min(), n.max(), M)

# 手工实现OSTU
ICV = 0
Threshold = 0
for t in np.linspace(n.min(), n.max() - 1):
    # print(t)
    filter_arr = n > t
    newarr = n[filter_arr]
    PA = len(newarr) / len(n)
    MA = newarr.mean()
    filter_arr = n <= t
    newarr = n[filter_arr]
    PB = len(newarr) / len(n)
    MB = newarr.mean()
    # print(PA, MA, PB, MB)

    I = PA * (MA - M) ** 2 + PB * (MB - M) ** 2
    if I > ICV:
        ICV = I
        Threshold = t

# cv2的实现
ret, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print(Threshold, ret)

ret, img2 = cv2.threshold(img, Threshold, 255, cv2.THRESH_BINARY)
plt.subplot(1, 2, 1)
plt.imshow(img, 'gray')
plt.xticks([]), plt.yticks([])

plt.subplot(1, 2, 2)
plt.imshow(img2, 'gray')
plt.xticks([]), plt.yticks([])
plt.show()


标签:cdf,plt,图像识别,阈值,img,cv2,flatten,print,OSTU
来源: https://www.cnblogs.com/boyknight/p/15977668.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有