1、读取图片

2、转为灰度图片

3、滤波降噪

4、二值化

5、形态学处理,开闭运算,腐蚀填充

6、画轮廓,外接矩形,计算面积等

基于4.0.9.80 opencv版本

 

import cv2 as cv
import numpy as np

def show(img, title):
    cv.imshow(title, img)
    cv.waitKey()
    cv.destroyAllWindows()

image = cv.imread('./image_cn_web/luomao.png')
image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 灰度图

image_blur = cv.GaussianBlur(image_gray, (25, 25), 0, 0) # 过滤降噪

# show(image_blur, '过滤降噪')

# 二值化
img_bin = cv.adaptiveThreshold(image_blur, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, blockSize=35, C=2)
show(img_bin, '二值化')

# 形态学处理
kernel = np.ones((3, 3), np.uint8)
img_bin_open = cv.morphologyEx(img_bin, cv.MORPH_OPEN, kernel) # 开运算

show(img_bin_open, '开运算')

kernel = np.ones((25, 25), np.uint8)
img_bin_close = cv.morphologyEx(img_bin_open, cv.MORPH_CLOSE, kernel) # 闭运算
show(img_bin_close, '闭运算')

kernel = np.ones((7, 7), np.uint8)
image_bin_open = cv.morphologyEx(img_bin_close, cv.MORPH_OPEN, kernel) # 开运算
show(img_bin_open, '开运算')

kernel = np.ones((25, 25), np.uint8)
image_bin_close = cv.morphologyEx(image_bin_open, cv.MORPH_CLOSE, kernel) # 闭运算
show(img_bin_close, '闭运算')

cnts, hierarchy = cv.findContours(image_bin_close, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

img2 = image.copy()
img_withcontours = cv.drawContours(img2, cnts, -1, (0, 0, 255), 3)
# cv.imshow('result', img_withcontours)
# cv.waitKey()
# cv.destroyAllWindows()