python,opencv利用自适应阈值分割法实现微滴图像分割并计数
生活随笔
收集整理的這篇文章主要介紹了
python,opencv利用自适应阈值分割法实现微滴图像分割并计数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import cv2
import numpy as npblockSize = 31
value = -1#count = 0 #液滴總數
area = 0 #單個液滴面積
min_area = 40
max_area = 1500#閉運算
def close(image):kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))iClose = cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)return iClose#開運算
def open(image):kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(16,16))iOpen = cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel)return iOpen#查找輪廓
def findConftours(srcImage,binary):contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(srcImage,contours,-1,(0,0,255),3)#遍歷所有的熒光區域,計數
def countAll(contours,image):global countcount = 0for i in range(np.size(contours)):area = cv2.contourArea(contours[i]) #計算閉合輪廓面積if (area < min_area) or (area > max_area):continueelse:count = count + 1(x,y),radius = cv2.minEnclosingCircle(contours[i])(x,y,radius) = np.int0((x,y,radius))cv2.circle(image,(x,y),radius,(0,0,255),2)return image,countdef cut():img = cv2.imread("E:/PythonWorkspace/yiingguang_image_process/images/1121.bmp")grayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)img2 = img.copy()#ret, th1 = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)# 第一個參數為原始圖像矩陣,第二個參數為像素值上限,第三個是自適應方法(adaptive method):# -----cv2.ADAPTIVE_THRESH_MEAN_C:領域內均值# -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:領域內像素點加權和,權重為一個高斯窗口# 第四個值的賦值方法:只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV# 第五個Block size:設定領域大小(一個正方形的領域)# 第六個參數C,閾值等于均值或者加權值減去這個常數(為0相當于閾值,就是求得領域內均值或者加權值)# 這種方法理論上得到的效果更好,相當于在動態自適應的調整屬于自己像素點的閾值,而不是整幅圖都用一個閾值#th2 = cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize, value)#th3 = cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize, value)th4 = cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize, value)#cv2.imshow('img', grayImage)#cv2.imshow('th1', th1)#cv2.imshow('th2', th2)#cv2.imshow('th3', th3)cv2.imshow('th4', th4)close_image = th4#去除噪聲,形態學操作#閉運算iClose = close(close_image)cv2.imshow("close",iClose)#開運算后iOpen = open(iClose)cv2.imshow("close_and_open",iOpen)binary,contours,hirarchy = cv2.findContours(iOpen,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)print("所有的熒光區域:"+format(np.size(contours)))#顯示輪廓res = cv2.drawContours(img,contours,-1,(0,0,255),2)#tmp = np.zeros(img.shape,np.uint8)#res = cv2.drawContours(tmp, contours, -1, (0, 0, 255), 2)cv2.imshow("cut_res",res)cv2.imwrite("adaptiveThreshold_cut_res.bmp",res)#繪制最小外接圓res,count = countAll(contours,img2)cv2.imshow("cirle_res",res)cv2.imwrite("adaptiveThreshold_cirle_res.bmp",res)print("篩選后的熒光亮點數:"+format(count))cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':cut()
?
總結
以上是生活随笔為你收集整理的python,opencv利用自适应阈值分割法实现微滴图像分割并计数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 松下PLC项目实例,两台CPU间通过RS
- 下一篇: Zeta电位计算理论