[python] opencv传统图像处理

图片一般处理

src = cv2.imread(image_file, cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)	# 转换为灰度图
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))

eroded = cv2.erode(img_gray, kernel)    # 腐蚀图像
dilated = cv2.dilate(eroded, kernel)    # 膨胀图像
blur = cv2.blur(dilated, (13, 13))
# blur = cv2.medianBlur(binary, 5)  # 中值滤波
# blur = cv2.GaussianBlur(img_gray, (5, 5), 0)		# 高斯滤波
binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]	# OTSU二值化

_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)	#找轮廓

maxArea = 0
# 挨个检查看那个轮廓面积最大
for i in range(len(contours)):
    if cv2.contourArea(contours[i]) > cv2.contourArea(contours[maxArea]):
        maxArea = i
        
hull = cv2.convexHull(contours[maxArea])  	# 计算凸包   

cv2.namedWindow("image", cv2.WINDOW_NORMAL)
cv2.resizeWindow("image", 1000, 1000)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画图

会改变src

坐标 (x,y)
cv2.circle(src, tuple(box[i]), color=(0, 255, 255), radius=20, thickness=-1)	# thickness负数 填充
cv2.putText(img_orgin, f'{category}  {confidence}', (x0, y0), cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.8, color=(0, 255, 255),thickness=3)
cv2.rectangle(src, (x0, y0), (x1, y1), (255, 0, 0), thickness=5)

Contours

_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.contourArea(contours[i]) # 获取当前轮廓的面积
cv2.drawContours(img, contours, -1, (0, 0, 255), 3)	# 绘制轮廓	contours.shape=(n, 64, 1, 2)	# 改变src
# 第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
#     cv2.RETR_EXTERNAL 表示只检测外轮廓
#     cv2.RETR_LIST 检测的轮廓不建立等级关系
#     cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
#     cv2.RETR_TREE 建立一个等级树结构的轮廓。
# 
# 第三个参数method为轮廓的近似办法
#     cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
#     cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
#     cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain 近似算法

rect = cv2.minAreaRect(contours[maxArea])  # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
box = cv2.boxPoints(rect)  # 获取四个顶点坐标
box = np.int32(box)
flag = cv2.pointPolygonTest(contours[i], test_point, False)	# 检测点是否在轮廓内 test_point为tuple类型,返回1为在内 0为在轮廓上 -1为在外

腐蚀膨胀

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
# 矩形:MORPH_RECT
# 交叉形:MORPH_CROSS
# 椭圆形:MORPH_ELLIPSE

eroded = cv2.erode(img_gray, kernel, iterations=4)    # 腐蚀图像	iterations次数
dilated = cv2.dilate(eroded, kernel, iterations=4)    # 膨胀图像 

添加滑块 实现参数调节 更新显示

def MyThreshold(th):
    binary = cv2.threshold(img_gray, th, 255, cv2.THRESH_BINARY)[1]
    cv2.imshow('image', binary)
    
cv2.namedWindow("image", 0)
cv2.resizeWindow("image", 800, 800)
cv2.createTrackbar('threshold', 'image', lowThreshold, max_lowThreshold, MyThreshold)
# cv2.imshow('image', binary)
cv2.waitKey(0)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值