8 python opencv image-processing scipy
我有一个像我正在侵蚀和扩张的图像:
kernel = np.ones((5,5),np.float32)/1
eroded_img = cv2.erode(self.inpainted_adjusted_image, kernel, iterations=10)
dilated_img = cv2.dilate(eroded_img, kernel, iterations=10)
Run Code Online (Sandbox Code Playgroud)
这是侵蚀和膨胀的结果:
然后我就像这样采取它的门槛:
self.thresh = cv2.threshold(dilated_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
Run Code Online (Sandbox Code Playgroud)
但是阈值给了我一个不必要的扩展,我在下面的图像中标记了(红线上方的区域是不需要的区域):
如何摆脱这个不受欢迎的区域?有没有更好的方法来做我正在做的事情?
使用不同类型的阈值(自适应阈值,考虑到当地的百分比)将已经解决您的问题:自适应阈值结果是您正在寻找的.
[编辑:我冒昧地在霍夫圈子上添加了一些代码.我承认我已经使用了这个单个图像的参数来获得漂亮的结果,尽管我不知道你需要什么类型的精确度来解决这类问题]
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image.png',0)
thresh = cv2.threshold(img, 210, 255, cv2.ADAPTIVE_THRESH_MEAN_C)[1]
canny = cv2.Canny(thresh,50,150)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,20, param1=50,param2=23,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),3)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
titles = ['Original Image', 'Adaptive Thresholding', "Canny", "Hough Circle"]
images = [img, thresh, canny, cimg]
for i in xrange(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果这还不够,请告诉我们.
小智 4
从二值图像中,使用霍夫变换来拟合圆是相当容易的。一旦你有了圆的外边界,我建议对边界进行出血并剪掉边界之外的部分。
另一种方法是调整阈值。看起来你可以逃脱惩罚。您可能需要一些形态学操作才能获得清晰的边缘。使用圆盘内核将有助于在很大程度上保持形状。
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |