重磅干貨,第一時間送達(dá)
# import the necessary packages
from skimage.feature import peak_local_max
from skimage.morphology import watershed
from scipy import ndimage
import numpy as np
import argparse
import imutils
import cv2
# load the image and perform pyramid mean shift filtering
# to aid the thresholding step
image = cv2.imread('1.jpg')
shifted = cv2.pyrMeanShiftFiltering(image, 21, 51)
cv2.imshow('Input', image)
# convert the mean shift image to grayscale, then apply
# Otsu's thresholding
gray = cv2.cvtColor(shifted, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv2.imshow('Thresh', thresh)
# compute the exact Euclidean distance from every binary
# pixel to the nearest zero pixel, then find peaks in this
# distance map
D = ndimage.distance_transform_edt(thresh)
localMax = peak_local_max(D, indices=False, min_distance=10,
labels=thresh)
# perform a connected component analysis on the local peaks,
# using 8-connectivity, then appy the Watershed algorithm
markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]
labels = watershed(-D, markers, mask=thresh)
print('[INFO] {} unique segments found'.format(len(np.unique(labels)) - 1))
# loop over the unique labels returned by the Watershed
# algorithm
for label in np.unique(labels):
# if the label is zero, we are examining the 'background'
# so simply ignore it
if label == 0:
continue
# otherwise, allocate memory for the label region and draw
# it on the mask
mask = np.zeros(gray.shape, dtype='uint8')
mask[labels == label] = 255
# detect contours in the mask and grab the largest one
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
c = max(cnts, key=cv2.contourArea)
# draw a circle enclosing the object
((x, y), r) = cv2.minEnclosingCircle(c)
cv2.circle(image, (int(x), int(y)), int(r), (0, 255, 0), 2)
cv2.putText(image, '{}'.format(label), (int(x) - 10, int(y)),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
# show the output image
cv2.imshow('Output', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
import cv2
from matplotlib import pyplot as plt
font=cv2.FONT_HERSHEY_SIMPLEX
img = cv2.imread('5.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,245,255,cv2.THRESH_BINARY)
cv2.imshow('threshold', thresh)
k = cv2.getStructuringElement(cv2.MORPH_RECT,(13,13))
dilate = cv2.dilate(thresh,k,iterations=3)
cv2.imshow('dilate', dilate)
cv2.bitwise_not(dilate, dilate)
dist_transform = cv2.distanceTransform(dilate,cv2.DIST_L2,3)
dist = cv2.normalize(dist_transform,dist_transform,0,1.0,cv2.NORM_MINMAX)
cv2.imshow('distance', dist)
cv2.imwrite('dis.jpg', dist)
#dist = np.uint8(dist)
dist = cv2.convertScaleAbs(dist)
ret2,morph = cv2.threshold(dist,0.99,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#ret2, morph = cv2.threshold(dist,0,255,cv2.THRESH_BINARY_INV)
cv2.imshow('morph', morph)
k2 = cv2.getStructuringElement(cv2.MORPH_RECT,(11,5))
sure_fg = cv2.morphologyEx(morph,cv2.MORPH_OPEN,k2, iterations = 1) # 形態(tài)開運(yùn)算
cv2.imshow('result', sure_fg)
thresh,contours,hierarchy = cv2.findContours(sure_fg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i in range(0,len(contours)):
(x, y, w, h) = cv2.boundingRect(contours[i])
#cv2.drawContours(img,contours,i,(0,255,0),5)
cv2.circle(img,(x+int(w/2),y+int(h/2)),20,(0,0,255),-1, cv2.LINE_AA)
cv2.putText(img,str(i+1),(x+int(w/2)-15,y+int(h/2)+5),font,0.8,(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
聯(lián)系客服