如何使用 opencv 从图像中改进矩形?
How to improve rectangles from image using opencv?
我有一个如下所示的输入图像:
]
我做了一些处理,并从我的输入图像中得到线条,如下 Lined Image :
我想要像这样检测到单元格的输出:输出图像
我尝试使用 findContours
和 connectedComponentsWithStats
方法找到单元格边界框,但它们没有给我令人满意的结果。
我的代码:
对于轮廓:
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for contour in contours[2:]:
(x,y,w,h) = cv2.boundingRect(contour)
cv2.rectangle(img, (x,y), (x+w,y+h),(0, 255, 0),2)
对于 connectedComponentsWithStats:
_, labels, stats,_ = cv2.connectedComponentsWithStats(img, connectivity=4, ltype=cv2.CV_32S)
for x,y,w,h,area in stats[2:]:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
感谢任何帮助。
#
import cv2
image = cv2.imread('JoWnj.jpg')
result = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 51, 9)
# Fill rectangular contours
# CHECK OTHER CONTOUR SETTINGS ? TO EXLCUDE OUTER ?
# https://docs.opencv.org/master/d9/d8b/tutorial_py_contours_hierarchy.html
# https://medium.com/analytics-vidhya/opencv-findcontours-detailed-guide-692ee19eeb18
# cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(thresh, [c], -1, (255, 255, 255), -1)
cv2.drawContours(thresh, [c], -1, (0, 0, 0), 1)
# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 4))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4)
# opening = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=4)
# Draw rectangles
# cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y-3), (x + w, y + h-3), (36, 255, 12), 1)
# filled
# cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), -1)
cv2.imwrite('sunday.jpg', image)
result image that You want:
参考:
我有一个如下所示的输入图像:
我做了一些处理,并从我的输入图像中得到线条,如下 Lined Image :
我想要像这样检测到单元格的输出:输出图像
我尝试使用 findContours
和 connectedComponentsWithStats
方法找到单元格边界框,但它们没有给我令人满意的结果。
我的代码:
对于轮廓:
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for contour in contours[2:]:
(x,y,w,h) = cv2.boundingRect(contour)
cv2.rectangle(img, (x,y), (x+w,y+h),(0, 255, 0),2)
对于 connectedComponentsWithStats:
_, labels, stats,_ = cv2.connectedComponentsWithStats(img, connectivity=4, ltype=cv2.CV_32S)
for x,y,w,h,area in stats[2:]:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
感谢任何帮助。
#
import cv2
image = cv2.imread('JoWnj.jpg')
result = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 51, 9)
# Fill rectangular contours
# CHECK OTHER CONTOUR SETTINGS ? TO EXLCUDE OUTER ?
# https://docs.opencv.org/master/d9/d8b/tutorial_py_contours_hierarchy.html
# https://medium.com/analytics-vidhya/opencv-findcontours-detailed-guide-692ee19eeb18
# cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(thresh, [c], -1, (255, 255, 255), -1)
cv2.drawContours(thresh, [c], -1, (0, 0, 0), 1)
# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 4))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4)
# opening = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=4)
# Draw rectangles
# cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y-3), (x + w, y + h-3), (36, 255, 12), 1)
# filled
# cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), -1)
cv2.imwrite('sunday.jpg', image)
result image that You want: 参考: