阈值分割python实现

阈值分割python实现1 直方图技术法 importcv2imp image rows cols image shapegrayHis np zeros 256 np uint64 forrinrange rows

1、直方图技术法

import cv2 import numpy as np from scipy import signal import math def calcGrayHist(image): rows,cols=image.shape grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]]+=1 return grayHist def threshTwoPeaks(image): histogram=calcGrayHist(image) maxLoc=np.where(histogram==np.max(histogram)) firstPeak=maxLoc[0][0] measureDists=np.zeros([256],np.float32) for k in range(256): measureDists[k]=pow(k-firstPeak,2)*histogram[k] maxLoc2=np.where(measureDists==np.max(measureDists)) secondPeak=maxLoc2[0][0] thresh=0 if firstPeak>secondPeak: temp=histogram[int(secondPeak):int(firstPeak)] minLoc=np.where(temp==np.min(temp)) thresh=secondPeak+minLoc[0][0]+1 else: temp=histogram[int(firstPeak):int(secondPeak)] minLoc=np.where(temp==np.min(temp)) thresh=firstPeak+minLoc[0][0]+1 threshImage_out=image.copy() threshImage_out[threshImage_out>thresh]=255 threshImage_out[threshImage_out<=thresh]=0 return (thresh,threshImage_out) image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) thresh,out=threshTwoPeaks(image) print(thresh) cv2.imshow("out",out) cv2.waitKey(0) cv2.destroyAllWindows() 

2、熵算法

import cv2 import numpy as np from scipy import signal import math def calcGrayHist(image): rows,cols=image.shape grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]]+=1 return grayHist def threshEntroy(image): rows,cols=image.shape grayHist=calcGrayHist(image) normGrayHist=grayHist/float(rows*cols) zeroCumuMoment=np.zeros([256],np.float32) for k in range(256): if k==0: zeroCumuMoment[k]=normGrayHist[k] else: zeroCumuMoment[k]=zeroCumuMoment[k-1]+normGrayHist[k] entropy=np.zeros([256],np.float32) for k in range(256): if k==0: if normGrayHist[k]==0: entropy[k]=0 else: entropy[k]=-normGrayHist[k]*math.log10(normGrayHist[k]) else: if normGrayHist[k]==0: entropy[k]=entropy[k-1] else: entropy[k]=entropy[k-1]-normGrayHist[k]*math.log10(normGrayHist[k]) fT=np.zeros([256],np.float32) ft1,ft2=0.0,0.0 totalEntroy=entropy[255] for k in range(255): maxFront=np.max(zeroCumuMoment[0:k+1]) maxBack=np.max(zeroCumuMoment[k+1:256]) if maxFront==0 or zeroCumuMoment[k]==0 or maxFront==1 or zeroCumuMoment[k]==1 or totalEntroy==0: ft1=0 else: ft1=entropy[k]/totalEntroy*(math.log10(zeroCumuMoment[k])/math.log10(maxFront)) if maxBack==0 or 1-zeroCumuMoment[k]==0 or maxBack==1 or 1-zeroCumuMoment[k]==1: ft2=0 else: if totalEntroy==0: ft2=math.log10(1-zeroCumuMoment[k])/math.log10(maxBack) else: ft2=(1-entropy[k]/totalEntroy)*(math.log10(1-zeroCumuMoment[k])/math.log10(maxBack)) fT[k]=ft1+ft2 threshLoc=np.where(fT==np.max(fT)) thresh=threshLoc[0][0] threshold=np.copy(image) threshold[threshold>thresh]=255 threshold[threshold<=thresh]=0 return (thresh,threshold) image=cv2.imread("/home/xiaomingming/profile/dog.jpg",cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) thresh,out=threshEntroy(image) print(thresh) out=np.round(out) out.astype(np.uint8) cv2.imshow("out",out) cv2.waitKey(0) cv2.destroyAllWindows() 

3、otsu阈值处理

import cv2 import numpy as np from scipy import signal import math def calcGrayHist(image): rows,cols=image.shape grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]]+=1 return grayHist def otsu(image): rows,cols=image.shape grayHist=calcGrayHist(image) uniformGrayHist=grayHist/float(rows*cols) zeroCumuMoment=np.zeros([256],np.float32) oneCumuMoment=np.zeros([256],np.float32) for k in range(256): if k==0: zeroCumuMoment[k]=uniformGrayHist[0] oneCumuMoment[k]=k*uniformGrimport cv2 import numpy as np from scipy import signal import math def calcGrayHist(image): rows,cols=image.shape grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]]+=1 return grayHist def adaptiveThresh(I,winSize,ratio=0.15): I_mean=cv2.boxFilter(I,cv2.CV_32FC1,winSize) out=I-(1.0-ratio)*I_mean out[out>=0]=255 out[out<0]=0 out=np.round(out) out=out.astype(np.uint8) return out image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) out=adaptiveThresh(image,(11,11)) #out=np.round(out) #out.astype(np.uint8) cv2.imshow("out",out) cv2.waitKey(0) cv2.destroyAllWindows()ayHist[0] else: zeroCumuMoment[k]=zeroCumuMoment[k-1]+uniformGrayHist[k] oneCumuMoment[k]=oneCumuMoment[k-1]+k*uniformGrayHist[k] mean=oneCumuMoment[255] variance=np.zeros([256],np.float32) for k in range(255): if zeroCumuMoment[k]==0 or zeroCumuMoment[k]==1: variance[k]=0 else: variance[k]=math.pow(mean*zeroCumuMoment[k]-oneCumuMoment[k],2.0)/(zeroCumuMoment[k]*(1-zeroCumuMoment[k])) threshLoc=np.where(variance[0:255]==np.max(variance[0:255])) thresh=threshLoc[0][0] threshold=np.copy(image) threshold[threshold>thresh]=255 threshold[threshold<=thresh]=0 return (thresh,threshold) image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) thresh,out=otsu(image) print(thresh) out=np.round(out) out.astype(np.uint8) cv2.imshow("out",out) cv2.waitKey(0) cv2.destroyAllWindows() 

4、自适应阈值分割

import cv2 import numpy as np from scipy import signal import math def calcGrayHist(image): rows,cols=image.shape grayHist=np.zeros([256],np.uint64) for r in range(rows): for c in range(cols): grayHist[image[r][c]]+=1 return grayHist def adaptiveThresh(I,winSize,ratio=0.15): I_mean=cv2.boxFilter(I,cv2.CV_32FC1,winSize) out=I-(1.0-ratio)*I_mean out[out>=0]=255 out[out<0]=0 out=np.round(out) out=out.astype(np.uint8) return out image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) out=adaptiveThresh(image,(11,11)) #out=np.round(out) #out.astype(np.uint8) cv2.imshow("out",out) cv2.waitKey(0) cv2.destroyAllWindows() 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223621.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:47
下一篇 2026年3月17日 下午1:47


相关推荐

  • java面向对象三大特性「建议收藏」

    java面向对象三大特性「建议收藏」一、面向对象的概念面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物使用对象的关系来描述事物之间的联系,这种思想就是面向对象。提到面向对象,自然会想到面向过程,面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候一个一个依次调用就可以了。面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来

    2022年7月8日
    20
  • linux虚拟机设置固定IP

    linux虚拟机设置固定IPlinux虚拟机设置固定IPubuntu虚拟机(桥接模式)设置固定IP方法很简单,直接在系统设置里面配置就可以了1.先使用ifconfig查看掩码2.点击设置3.点击network再点击set4.第一个为虚拟机ip,为避免冲突,建议设置210以上的ip5.重启,ifconfig查看ip不同版本系统界面可能不同,但操作类似…

    2022年7月16日
    14
  • 简述xss的攻击原理及防范措施_安全攻击主要来自

    简述xss的攻击原理及防范措施_安全攻击主要来自Web安全系列(一):XSS 攻击基础及原理

    2022年4月20日
    63
  • 计算机cmd入门,教大家5个装逼用的CMD命令,让人一看你就是个电脑高手

    计算机cmd入门,教大家5个装逼用的CMD命令,让人一看你就是个电脑高手很多电脑小白使用电脑时,只会用鼠标点来点去的,教大家5个装逼用的CMD命令,让人一看你就是个电脑高手,专门震慑小姐姐、小学生。首先我们需要打开CMD命令提示符,这个操作大家都知道,按下键盘上的Windows+R键,然后输入“CMD”,按下回车键。一、改变命令提示符配色我们可以先输入“Color”—“空格”—“help”,来获取颜色的帮助。从这里可以看到,各种颜色的代码:0~7、A~F。如果想…

    2022年5月5日
    1.0K
  • CentOS7 网络配置超详细ip、网关设置

    CentOS7 网络配置超详细ip、网关设置CentOS7网络配置一、在虚拟机中安装CentOS操作系统安装好虚拟机创建新的虚拟机,选择自定义(高级),点击下一步虚拟机硬件兼容性默认,浏览需要安装的CentOS6.5镜像文件自定义用户名和密码(用于登录)设置虚拟机名称和存储路径处理器设置默认(后面可以修改),内存设为1GB网络类型选择NAT模式选择创建新虚拟磁盘最大磁盘大小设为20GB,然后将虚拟磁盘存储为单个文件将创建好的磁盘文件存储在虚拟机指定目录下虚拟机创建完成二、虚拟网络配置编辑虚拟网络设置

    2022年6月14日
    86
  • 搭建DNS服务器的那些知识「建议收藏」

    搭建DNS服务器的那些知识「建议收藏」一、DNS服务概述:1.什么是DNS?DNS(DomainNameSystem)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析。DNS协议运行在UDP协议之上,使用端口53号。2.什么是域、域名?域(domain)是计算机网络的一种形式,其中所有用户账户,计算机,打印机和其他安全主体都在位于称为域控制器的一个或多个中央计算机集群上的中央数据库中注册。

    2025年9月16日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号