OpenCV——图像特征提取(颜色:HSV与形状)

OpenCV中的图像处理,特征提取,每一步的步骤,解释,都写在了代码旁边,容易解释。

import cv2
import numpy as np

# 预处理阶段
# 读取图片
pic_file = 'pic.png'
# 读取
image = cv2.imread(pic_file)
# 用于提取颜色特征的图片,必须是原图不能用灰度图
hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 灰度图
img_bgr = cv2.imread(pic_file, cv2.IMREAD_GRAYSCALE)
# 原图,用于最后展示时使用
r_image = cv2.imread(pic_file)
# 原来图片缩小30%
per = 30
w = int(img_bgr.shape[1] * per / 100)
h = int(img_bgr.shape[0] * per / 100)
dim = (w, h)
# 三张图都要做
img = cv2.resize(img_bgr, dim, interpolation=cv2.INTER_AREA)
hsv_img = cv2.resize(hsv_img, dim, interpolation=cv2.INTER_AREA)
r_image = cv2.resize(r_image, dim, interpolation=cv2.INTER_AREA)
# cv2.imshow("input", img)
# 高斯滤波处理
img = cv2.GaussianBlur(img, (5, 5), 0)
# cv2.imshow('blurred', img)
img_copy = img.copy()
# 二值法
ret, binary = cv2.threshold(img_copy, 100, 255, cv2.THRESH_BINARY)
# cv2.imshow('binary',binary)
# 腐蚀与膨胀的形态学操作
kernel = np.ones((5, 5), np.uint8)
# 第三个参数是值操作次数
erosion = cv2.erode(binary, kernel, iterations=2)
# cv2.imshow('fushi',erosion)
binary = cv2.dilate(erosion, kernel, iterations=4)
# cv2.imshow('pengzhang',binary)
# 这里利用像素进行了,图像的面积求值,更加准确

# 轮廓面积
height = binary.shape[0]
width = binary.shape[1]
k = 0
for i in range(height):
    for j in range(width):
        if binary[i, j].all() > 0:
            k += 1
# k 就是图像的面积
# 这里继续进行轮廓检测
ref_, refCnts, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1)

# 外接矩形面积
area2 = cv2.contourArea(refCnts[0])

# 外接矩形周长
length = cv2.arcLength(refCnts[0], True)

# 求出外接矩形的顶点
x, y, w, h = cv2.boundingRect(refCnts[0])

# 区域占空⽐(轮廓区域⾯积除以最⼩外接矩形⾯积)
ee = k / area2

started = (x - 5, y - 10)
stopped = (x + w + 5, y + h + 5)
# 画出图像的最小外接矩形
img = cv2.rectangle(img, started, stopped, (255, 255, 255), 2)
# 根据最小外接矩形进行裁剪,得出目标的图片
cropped = img[started[1]: stopped[1], started[0]: stopped[0]]    # 图像处理需要灰度图
hsv_img = hsv_img[started[1]: stopped[1], started[0]: stopped[0]]  # 颜色图,hsv需要原图
r_image = r_image[started[1]: stopped[1], started[0]: stopped[0]]  # 结果需要呈现原图

# 给图像加上标签
text1 = 'height:' + str(h)
text2 = "width:" + str(w)
text3 = 'area:' + str(k)
text4 = 'ee:' + str(ee)
cv2.putText(r_image, text1, (10, 20), 3, 0.3, (255, 255, 255), 1, cv2.LINE_AA, 0)
cv2.putText(r_image, text2, (10, 40), 3, 0.3, (255, 255, 255), 1, cv2.LINE_AA, 0)
cv2.putText(r_image, text3, (10, 60), 3, 0.3, (255, 255, 255), 1, cv2.LINE_AA, 0)
cv2.putText(r_image, text4, (10, 80), 3, 0.3, (255, 255, 255), 1, cv2.LINE_AA, 0)
print(h)
print(w)
print(ee)
print(area2)
print(k)
cv2.imshow('color', hsv_img)
cv2.imshow('shape', r_image)
cv2.waitKey()

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,并支持多种编程语言,包括C++。图像特征提取和识别是OpenCV的核心功能之一。 图像特征提取是指从原始图像提取出具有丰富信息的特征,这些特征可用于图像分析、目标检测和图像识别等任务。OpenCV提供了多种图像特征提取算法,如Harris角点检测、SIFT、SURF和ORB等。这些算法能够自动检测图像中的关键特征点,如角点、边缘和斑点,并计算出这些特征的描述子。 图像识别是指将提取出的图像特征进行匹配和分类,以实现对图像内容的自动识别和理解。OpenCV提供了多种图像识别算法,如基于特征点匹配的图像拼接、目标跟踪和物体识别等。通过在不同图像中匹配相似的特征点,并计算它们之间的相似度,可以实现对目标物体的识别和跟踪。 在使用OpenCV进行图像特征提取和识别时,首先需要加载并预处理原始图像,并选择适合的特征提取算法,提取图像中的关键特征点和其描述子。然后,可以使用这些特征点进行匹配和分类,以实现图像的拼接、目标跟踪和物体识别等功能。 总而言之,OpenCV图像特征提取与识别库提供了丰富的功能和算法,能够帮助我们从图像提取有用的特征,并实现对图像内容的自动识别和理解,为计算机视觉和图像处理相关领域的研究和应用提供强大的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值