Python+OpenCV怎么实现阈值分割
这篇文章主要介绍“Python+OpenCV怎么实现阈值分割”,在日常操作中,相信很多人在Python+OpenCV怎么实现阈值分割问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python+OpenCV怎么实现阈值分割”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、全局阈值
原图:
整幅图采用一个阈值,与图片的每一个像素灰度进行比较,重新赋值;
1.效果图
2.源码
import cv2import 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()
二、滑动改变阈值(滑动条)
1.效果图
2.源码
代码如下(示例):
import cv2import numpy as npimport 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)#初始化阈值,定义全局变量imgsthresh=130imgs=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')#新建滑动条,初始位置为130cv2.createTrackbar('threshold value','Images',130,255,threshold_segmentation)#第一次调用函数threshold_segmentation(thresh)#显示图像while(1): cv2.imshow('Images',imgs) if cv2.waitKey(1)==ord('q'): breakcv2.destroyAllWindows()
三、自适应阈值分割
1.效果图
2.源码
代码如下(示例):
import cv2import 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()
3.GaussianBlur()函数去噪
代码如下(示例):
import cv2import 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()
四、参数解释
cv2.threshold(class="lazy" data-src, thresh, maxval, type)
参数:
class="lazy" data-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:阈值分割后的图像
到此,关于“Python+OpenCV怎么实现阈值分割”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341