python-opencv知识总结之图像操作:创建、遍历、运算与查找

1.Numpy简介

python版的opencv用的容器不同于C++版的Mat,python版的图像容器基本都倚仗numpy,其数据类型如下:

在这里插入图片描述
数组属性
在这里插入图片描述

#创建一个numpy.array
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

在这里插入图片描述
数组操作:

 # 将所有轮廓点归到一个点集
    conts = []
    for i in cnts:
        tmp_list = np.squeeze(i).flatten().tolist()
        conts += tmp_list
    conts = np.array(conts, dtype=np.int32).reshape([-1, 2])
    print(conts)

2.创建空白图像

*******************************单通道***************************************
import cv2
import numpy as np

img_mask = np.zeros((src.shape[0], src.shape[1]), np.uint8)
img = np.zeros((10, 10), np.uint8)
# 浅灰色背景
img.fill(200)
cv2.imshow('img', img)
cv2.waitKey(0)

*******************************三通道***************************************
import cv2
import numpy as np

img = np.zeros((10, 10, 3), np.uint8)
# 浅灰色背景
img.fill(200)
cv2.imshow('img', img)
cv2.waitKey(0)

***************************显示图像并设置延时*********************************
def showImg(img0,name0,flg=0):
    '''
    显示图像
    Args:
        img0: 图像
        name0: 窗口名
        flg: 延时参数
    '''
    cv2.namedWindow(name0,cv2.WINDOW_NORMAL)
    cv2.imshow(name0,img0)
    if(flg==1):
        cv2.waitKey(0)
    elif flg>1:
        cv2.waitKey(flg)

3.图像mat操作

#图像大小:
h,w,channel=img.shape

#选取ROI
roi=img_mask[y:y+h,x:x+w]
#拼接
img_cat=cv2.hconcat([img_close,img_open])

#感兴趣区域赋值
mask0=np.zeros((img0.shape[0],img0.shape[1]),np.uint8)
seg0=np.zeros((img0.shape[0],img0.shape[1],img0.shape[2]),np.uint8)
cv2.drawContours(mask0, [box], 0, (255),-1 )
seg0[mask0>0]=img0[mask0>0]

4.绘图操作:点、线、图形

#绘制凸包
hulls = []
hull = cv2.convexHull(conts)
hulls.append(hull)
cv2.drawContours(src, hulls, -1, [255, 0, 25], 1)
# center, axes, angle = cv2.fitEllipseAMS(hulls[0])
# cv2.ellipse(src, box=tuple([center, axes, angle]), color=(5, 255, 10), thickness=2)
center, radius = cv2.minEnclosingCircle(hulls[0])
# print(center)
cv2.circle(src, tuple(np.int0(center)), int(radius + 8), (5, 255, 10), 2)

#line
cv2.line(canvas, (300, 0), (0, 300), (0,255,0), 3)


5.轮廓处理

'''
提取轮廓:输入二值图像,返回轮廓数组
'''
def getContour(img):
    # 寻找轮廓
    con_mask=img.copy()
    cnts, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(con_mask, cnts, -1, [0, 0, 255], 1)
    # showImg(src,"src")
    return cnts

cnts = sorted(contours, key=cv2.contourArea, reverse=True)  # 所有轮廓按面积排序
cnt = cnts[0]  # 第 0 个轮廓,面积最大的轮廓,(664, 1, 2)
print("shape of max contour:", cnt.shape[0])

# 轮廓近似,epsilon数值越小,越近似
epsilon = 0.08 * cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)
tmp2 = np.zeros(src.shape, np.uint8)
# 注意,这里approx要加中括号
res3 = cv.drawContours(tmp2, [approx], -1, (250, 250, 255), 1)
cv.imshow('approx', res3)
 
# 外接图形
x, y, w, h = cv.boundingRect(cnt)
# 直接在图片上进行绘制,所以一般要将原图复制一份,再进行绘制
tmp3 = src.copy()
res4 = cv.rectangle(tmp3, (x, y), (x + w, y + h), (0, 0, 255), 2)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月醉窗台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值