bitwise_and 两张图片并计算生成的对象
bitwise_and two images and counting the resulting objects
我试图在给定模型答案样本和答案 sheet 示例的情况下获得正确答案的数量,所以我正在使用 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()
看起来误报斑点比其他斑点小。按区域过滤轮廓...
area = cv2.contourArea(contour)
http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html
我更改了您的代码中的一些内容。
对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()
我试图在给定模型答案样本和答案 sheet 示例的情况下获得正确答案的数量,所以我正在使用 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()
看起来误报斑点比其他斑点小。按区域过滤轮廓...
area = cv2.contourArea(contour)
http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html
我更改了您的代码中的一些内容。
对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()