Python实现阈值分割的方法及过程是什么
Admin 2022-09-02 群英技术资讯 291 次浏览
原图:
整幅图采用一个阈值,与图片的每一个像素灰度进行比较,重新赋值;
import cv2 import matplotlib.pyplot as plt #设定阈值 thresh=130 #载入原图,并转化为灰度图像 img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0) img_original=cv2.resize(img_original,(0,0),fx=0.3,fy=0.3) #采用5种阈值类型(thresholding type)分割图像 retval1,img_binary=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY) retval2,img_binary_invertion=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY_INV) retval3,img_trunc=cv2.threshold(img_original,thresh,255,cv2.THRESH_TRUNC) retval4,img_tozero=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO) retval5,img_tozero_inversion=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO_INV) #采用plt.imshow()显示图像 imgs=[img_original,img_binary,img_binary_invertion,img_trunc,img_tozero,img_tozero_inversion] titles=['original','binary','binary_inv','trunc','tozero','tozero_inv'] for i in range(6): plt.subplot(2,3,i+1) plt.imshow(imgs[i],'gray') plt.title(titles[i]) plt.xticks([]) plt.yticks([]) plt.show()
代码如下(示例):
import cv2 import numpy as np import matplotlib.pyplot as plt #载入原图,转化为灰度图像,并通过cv2.resize()等比调整图像大小 img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0) img_original=cv2.resize(img_original,(0,0),fx=0.3,fy=0.3) #初始化阈值,定义全局变量imgs thresh=130 imgs=0 #创建滑动条回调函数,参数thresh为滑动条对应位置的数值 def threshold_segmentation(thresh): #采用5种阈值类型(thresholding type)分割图像 retval1,img_binary=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY) retval2,img_binary_invertion=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY_INV) retval3,img_trunc=cv2.threshold(img_original,thresh,255,cv2.THRESH_TRUNC) retval4,img_tozero=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO) retval5,img_tozero_inversion=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO_INV) #由于cv2.imshow()显示的是多维数组(ndarray),因此我们通过np.hstack(数组水平拼接) #和np.vstack(竖直拼接)拼接数组,达到同时显示多幅图的目的 img1=np.hstack([img_original,img_binary,img_binary_invertion]) img2=np.hstack([img_trunc,img_tozero,img_tozero_inversion]) global imgs imgs=np.vstack([img1,img2]) #新建窗口 cv2.namedWindow('Images') #新建滑动条,初始位置为130 cv2.createTrackbar('threshold value','Images',130,255,threshold_segmentation) #第一次调用函数 threshold_segmentation(thresh) #显示图像 while(1): cv2.imshow('Images',imgs) if cv2.waitKey(1)==ord('q'): break cv2.destroyAllWindows()
代码如下(示例):
import cv2 import matplotlib.pyplot as plt #载入原图 img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0) #全局阈值分割 retval,img_global=cv2.threshold(img_original,130,255,cv2.THRESH_BINARY) #自适应阈值分割 img_ada_mean=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,3) img_ada_gaussian=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3) imgs=[img_original,img_global,img_ada_mean,img_ada_gaussian] titles=['Original Image','Global Thresholding(130)','Adaptive Mean','Adaptive Guassian',] #显示图片 for i in range(4): plt.subplot(2,2,i+1) plt.imshow(imgs[i],'gray') plt.title(titles[i]) plt.xticks([]) plt.yticks([]) plt.show()
代码如下(示例):
import cv2 import matplotlib.pyplot as plt #载入原图 img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0) #高斯滤波 img_blur=cv2.GaussianBlur(img_original,(13,13),13) #根据情况修改参数 #自适应阈值分割 img_thresh=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3) img_thresh_blur=cv2.adaptiveThreshold(img_blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3) #显示图像 imgs=[img_thresh,img_thresh_blur] titles=['img_thresh','img_thresh_blur'] for i in range(2): plt.subplot(1,2,i+1) plt.imshow(imgs[i],'gray') plt.title(titles[i]) plt.xticks([]) plt.yticks([]) plt.show()
1.cv2.threshold(src, thresh, maxval, type)
参数:
src:输入的图像
thresh:图像分割所用的阈值(threshold value)
maxval:当阈值类型(thresholding type)采用cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV时像素点被赋予的新值
type:介绍6种类型:
cv2.THRESH_BINARY(当图像某点像素值大于thresh(阈值)时赋予maxval,反之为0。注:最常用)
cv2.THRESH_BINARY_INV(当图像某点像素值小于thresh时赋予maxval,反之为0)
cv2.THRESH_TRUNC(当图像某点像素值大于thresh时赋予thresh,反之不变。注:虽然maxval没用了,但是调用函数不能省略)
cv2.THRESH_TOZERO(当图像某点像素值小于thresh时赋予0,反之不变。注:同上)
cv2.THRESH_TOZERO_INV(当图像某点像素值大于thresh时赋予0,反之不变。注:同上)
cv2.THRESH_OTSU(该方法自动寻找最优阈值,并返回给retval,见下文)
返回值:
retval:设定的thresh值,或者是通过cv2.THRESH_OTSU算出的最优阈值
dst:阈值分割后的图像
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要给大家介绍了关于Python使用scipy进行曲线拟合的相关资料,Scipy优化和拟合采用的是optimize模块,该模块提供了函数最小值(标量或多维)、曲线拟合和寻找等式的根的有用算法,需要的朋友可以参考下
这篇文章主要为大家详细介绍了Python中集合的创建、使用和遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套,感兴趣的小伙伴可以了解一下
这篇文章主要介绍了python3使用迭代生成器实现减少内存占用的相关资料,需要的朋友可以参考下
这篇文章主要介绍了通过Pygame模块实现监听鼠标的功能,文章的示例代码讲解详细,对我们的学习或工作有一定的价值,感兴趣的小伙伴可以了解一下
这篇文章主要为大家介绍了PyTorch搭建双向LSTM实现时间序列负荷预测,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008