opencv宽高比基础知识

本文介绍了图像处理中的宽高比概念,通过Python和OpenCV库进行实例讲解。首先从简单的问题入手,计算手掌图像的宽高比,接着探讨如何处理和计算横椭圆和竖椭圆的宽高比,难度逐步提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面两篇文章我们讲了凸包和凸缺陷,这还是图像处理中,比较难理解的几个知识点。要用到一些循环,而且需要调试很多数据。并且运行代码时的报错,我是看都看不懂。所以说这几章内容还是要认真听讲。

宽高比

因为宽高比是图像轮廓中算比较简单的内容,所以用比较少的篇幅和例子来进行分享。

题1

在这里插入图片描述
让我们来获取这张手掌的宽高比

代码

#读出手图像的宽高比
import cv2
import numpy as np

o =cv2.imread("binaryhand.png")#读图
cv2.imshow("original",o)#展示凸包
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret,binary =cv2.threshold(gray,127,255,0)#阈值处理
contours,hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓
x,y,w,h =cv2.boundingRect(contours[0])
cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)
aspectRatio = float(w)/h
print(aspectRatio)

cv2.imshow("result",o)#展示凸包
cv2.waitKey(0)
cv2.destroyAllWindows()

将这个代码运行之后,我们就获取了这个手掌的宽高比(0.6248294679399727)也是很简单。

图2

接下来就是连环题,题目虽然不同,但是我们用的图片是同一张。让我们分别获取图中横着的椭圆和竖着的椭圆的宽高比。这次难度增加了很多,不仅需要处理的图片增加了,而且形状也是不一样的。
上图
在这里插入图片描述

横椭圆

让我们先来获取横着的椭圆的宽高比。
代码

import cv2
import numpy as np
o =cv2.imread("face.png")#读图
cv2.imshow("original",o)#展示凸包
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret,binary =cv2.threshold(gray,127,255,0)#阈值处理
contours,hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓

for i in range(len(contours)):#循环
    x,y,w,h =cv2.boundingRect(contours[i])#矩形的包围框
    aspectRatio = float(w)/h#宽高比
    rectArea=w*h#矩形面积
    cntArea=cv2.contourArea(contours[i])#轮廓面积
    extend=float(cntArea)/rectArea#占空比
    print(extend)
    if aspectRatio>0.8:#宽高比大于0.8
        if 0.8>extend:#占空比小于0.8
            cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)#画出矩形
    #print(aspectRatio)

cv2.imshow("result",o)#展示凸包
cv2.waitKey(0)
cv2.destroyAllWindows()

竖椭圆

代码部分

import cv2
import numpy as np
o =cv2.imread("face.png")#读图
cv2.imshow("original",o)#展示凸包
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret,binary =cv2.threshold(gray,127,255,0)#阈值处理
contours,hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓

for i in range(len(contours)):#循环
    x,y,w,h =cv2.boundingRect(contours[i])#矩形的包围框
    aspectRatio = float(w)/h#宽高比
    rectArea=w*h#矩形面积
    cntArea=cv2.contourArea(contours[i])#轮廓面积
    extend=float(cntArea)/rectArea#占空比
    print(extend)
    if aspectRatio>0.8:#宽高比大于0.8
        if 0.8>extend:#占空比小于0.8
            cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)#画出矩形
    #print(aspectRatio)

cv2.imshow("result",o)#展示凸包
cv2.waitKey(0)
cv2.destroyAllWindows()

今天的分享就到这里
太累了
比谈恋爱还累
真的要死人了

究极目标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值