我试图通过模型答案的样本和答题纸示例来获取正确答案的数量,以便我使用cv2.bitwise_and
函数然后我会进行侵蚀和结果图像的扩张来计算代表正确答案的对象,但它不能正常工作。
以下是我使用的两个示例图片:
结果就是这样:
因此它检测到3个圆圈而不是2个。我试图改变侵蚀和膨胀的迭代次数并改变StructuringElement
的形状,但仍然得到错误的答案。
这是我的代码:
import numpy as np
import cv2
from PIL import Image
img1 = cv2.imread("model_c3.png")
img2 = cv2.imread("ex_c3.png")
retval1, img1 = cv2.threshold(img1,225,255,cv2.THRESH_BINARY_INV)
retval2, img2 = cv2.threshold(img2,225,255,cv2.THRESH_BINARY_INV)
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
img1gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
mask = cv2.bitwise_and(img1gray, img2gray,img2)
el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
e = cv2.erode(mask, el, iterations=2)
d = cv2.dilate(e, el, iterations=7)
im, contours, hierarchy = cv2.findContours(
d,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE
)
centers = []
radii = []
for contour in contours:
br = cv2.boundingRect(contour)
m = cv2.moments(contour)
center = (int(m['m10'] / m['m00']), int(m['m01'] / m['m00']))
centers.append(center)
print("There are {} circles".format(len(centers)))
cv2.imshow('result.png',d)
cv2.waitKey(0)
cv2.destroyAllWindows()
答案 0 :(得分:0)
似乎假阳性斑点比其他斑点小。按区域过滤轮廓......
area = cv2.contourArea(contour)
http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html
答案 1 :(得分:0)
我在代码中更改了一些内容。
对RGB图像进行阈值处理然后将其转换为灰色没有多大意义。 而不是对两个图像进行AND运算,然后进行形态学运算来清理结果,您应该只准备两个图像以进行正确的AND操作。使一个图像中的圆圈更大,而另一个图像中的圆圈更小。这样你也可以补偿两个图像之间的小偏移(你的AND结果中所有工件的原因)。
我不确定你是否完全理解你使用的功能,因为你使用奇怪的参数以奇怪的方式使用它们......
请注意,我刚刚更改了代码中的一些内容以使其正常工作。这不是一个完美的解决方案。
import numpy as np
import cv2
#from PIL import Image
img1 = cv2.imread("d://1.png")
img2 = cv2.imread("d://2.png")
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
img1gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
retval1, img1bin = cv2.threshold(img1gray,128,255,cv2.THRESH_BINARY_INV)
retval2, img2bin = cv2.threshold(img2gray,128,255,cv2.THRESH_BINARY_INV)
el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
e = cv2.erode(img1bin, el, iterations=2)
cv2.imshow("e", e)
d = cv2.dilate(img2bin, el, iterations=7)
result = cv2.bitwise_and(e, d)
cv2.imshow("d", d)
im, contours, hierarchy = cv2.findContours(
result,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE
)
centers = []
radii = []
for contour in contours:
br = cv2.boundingRect(contour)
m = cv2.moments(contour)
center = (int(m['m10'] / m['m00']), int(m['m01'] / m['m00']))
centers.append(center)
print("There are {} circles".format(len(centers)))
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()