Python+Opencv实现计算闭合区域面积

目录
  • 一、cv2.contourArea
  • 二、按像素个数计算连通域面积

一、cv2.contourArea

起初使用该函数的时候看不懂返回的面积,有0有负数的,于是研究了一下。

opencv计算轮廓内面积函数使用的是格林公式计算轮廓内面积的,公式如下:

由于格林公式计算单连通域面积是以逆时针为正方向的,而有时候我们输入的边缘数组是按照顺时针输入的,所以导致计算面积会出现负数;计算面积存在0的情况一般是只存在一个像素点作为边缘点,所以面积为0。

代码如下:

img = cv2.imread('test.png', 0)
contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1)
area = []
topk_contours =[]
for i in range(len(contours)):
    a = cv2.contourArea(contours[i], True)
    area.append(abs(a))
topk = 2 #取最大面积的个数
for i in range(2):
    top = area.index(max(area))
    area.pop(top)
    topk_contours.append(contours[top])
x, y = img.shape
mask = np.zeros((x, y, 3))
mask_img = cv2.drawContours(mask, topk_contours, -1, (255, 255, 255), 1)
cv2.imwrite('mask_img.png', mask_img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
cv2.imshow('mask_img:', mask_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

二、按像素个数计算连通域面积

这边再给出一种用边缘内像素个数来计算连通域面积的方法:

img = cv2.imread('test.png', 0)
contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1)
area = []
topk_contours =[]
x, y = img.shape
for i in range(len(contours)):
    # 对每一个连通域使用一个掩码模板计算非0像素(即连通域像素个数)
    single_masks = np.zeros((x, y))
    fill_image = cv2.fillConvexPoly(single_masks, contours[i], 255)
    pixels = cv2.countNonZero(fill_image)
    area.append(pixels)
topk = 2 #取最大面积的个数
for i in range(2):
    top = area.index(max(area))
    area.pop(top)
    topk_contours.append(contours[top])
mask = np.zeros((x,y,3))
mask_img = cv2.drawContours(mask, topk_contours, -1, (255, 255, 255), 1)
cv2.imwrite('mask_img.png', mask_img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
cv2.imshow('mask_img:', mask_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

到此这篇关于Python+Opencv实现计算闭合区域面积的文章就介绍到这了,更多相关Python Opencv面积内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python计算圆周长、面积、球体体积并画出圆

    输入半径,计算圆的周长.面积.球体体积,并画出这个圆.拖动条.输入框和图像控件的数据保持一致! Fedora下测试通过 复制代码 代码如下: #https://github.com/RobberPhex/GTK-Example-CalcAreafrom gi.repository import Gtk, Gdk, GdkPixbuffrom PIL import Image, ImageDrawfrom io import BytesIOfrom math import pi class Mod

  • Python实战之利用Geopandas算出每个省面积

    目录 1.准备 2.基本使用 3.绘制并算出每个省的面积 GeoPandas是一个基于pandas,针对地理数据做了特别支持的第三方模块. 它继承pandas.Series和pandas.Dataframe,实现了GeoSeries和GeoDataFrame类,使得其操纵和分析平面几何对象非常方便. 1.准备 开始之前,你要确保Python和pip已经成功安装在电脑上. 请选择以下任一种方式输入命令安装依赖: 1.Windows 环境 打开 Cmd (开始-运行-CMD). 2.MacOS 环境

  • 利用Python求阴影部分的面积实例代码

    一.前言说明 今天看到微信群里一道六年级数学题,如下图,求阴影部分面积 看起来似乎并不是很难,可是博主添加各种辅助线,写各种方法都没出来,不得已而改用写Python代码来求面积了 二.思路介绍 1.用Python将上图画在坐标轴上,主要是斜线函数和半圆函数 2.均匀的在长方形上面洒满豆子(假设是豆子),求阴影部分豆子占比*总面积 三.源码设计 1.做图源码 import matplotlib.pyplot as plt import numpy as np def init(): plt.xla

  • Python 简单计算要求形状面积的实例

    有个Q友问怎么写个程序能按照要求输入,再输出对应形状的面积? 我大概写了几行,没有考虑输出异常,重点想记录下 int 的接收,如下图 知识点就两个 1, 长方形面积 & 三角形面积,因为要从终端接收用户的多个参数输入,所以用了map(int, raw_input().split()) 这种方式 2. 圆面积只想保留小数点后两位,就用到了 %.2f 来接收 #!/usr/bin/python #-*-coding:utf-8 -*- name = raw_input("Please inp

  • Python计算不规则图形面积算法实现解析

    这篇文章主要介绍了Python计算不规则图形面积算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的外接矩形,但是后续会涉及到红圈内的面积在外接矩形下的占比问题,有些外接矩形内有多个红色标记,在使用网上的opencv的fillPoly填充效果非常不理想,还有类似python计算任意多边形方法也不理想的情况下,自己探索出的一种效果还不

  • python实现计算图形面积

    用Python编写关于计算图形面积的代码实现,供大家参考,具体内容如下 #寒假打卡28天第7天 import math class Round(): #圆形 def __init__(self, R): self.R = R def area(self): return self.R * self.R * 3.14 def girth(self): return self.R * 2 * 3.14 class Rectangle():#矩形 def __init__(self, length,

  • Python+Opencv实现计算闭合区域面积

    目录 一.cv2.contourArea 二.按像素个数计算连通域面积 一.cv2.contourArea 起初使用该函数的时候看不懂返回的面积,有0有负数的,于是研究了一下. opencv计算轮廓内面积函数使用的是格林公式计算轮廓内面积的,公式如下: 由于格林公式计算单连通域面积是以逆时针为正方向的,而有时候我们输入的边缘数组是按照顺时针输入的,所以导致计算面积会出现负数:计算面积存在0的情况一般是只存在一个像素点作为边缘点,所以面积为0. 代码如下: img = cv2.imread('te

  • Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    学在前面 上篇 OpenCV 博客原计划完成一个 识别银行卡号的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,也就无法进行后续的识别了,再次意识到了自己技术还不达标,继续学习.完不成,就实现其它学习项目. 轮廓识别实战 先看一下最终实现的效果,针对一张图片(该图片前景色和背景色差异较大),进行轮廓标记. 图片基本处理 import cv2 as cv src = cv.imread("./demo.jpg") gray = cv.cvtColor(src,

  • Python+OpenCV实现图片及视频中选定区域颜色识别

    近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步优化,但提升有限. 主要实现过程:按不同颜色的取值范围,对图像进行循环遍历,转换为灰度图,将本次遍历的颜色像素转换为白色,对白色部分进行膨胀处理,使其更加连续,计算白色部分外轮廓包围的面积累加求和,比较每种颜色围起来面积,保存最大值及其颜色,所有颜色遍历完后,返回最大值对应的颜色,显示在图像上 如果有类似的颜色识别的任务,可参考以下代码修改后实现具

  • Python OpenCV 直方图的计算与显示的方法示例

    本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了.这里直接介绍方法. 计算并显示直方图 与C++中一样,在Python中调用的OpenCV直方图计算函数为cv2.calcHist. cv2.calcHist的原型为: cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回his

  • Python+Opencv身份证号码区域提取及识别实现

    前端时间智能信息处理实训,我选择的课题为身份证号码识别,对中华人民共和国公民身份证进行识别,提取并识别其中的身份证号码,将身份证号码识别为字符串的形式输出.现在实训结束了将代码发布出来供大家参考,识别的方式并不复杂,并加了一些注释,如果有什么问题可共同讨论.最后重要的事情说三遍:请勿直接抄袭,请勿直接抄袭,请勿直接抄袭!尤其是我的学弟学妹们,还是要自己做的,小心直接拿我的用被老师发现了挨批^_^. 实训环境:CentOS-7.5.1804 + Python-3.6.6 + Opencv-3.4.

  • python+opencv图像分割实现分割不规则ROI区域方法汇总

    在图像分割领域,一个重要任务便是分割出感兴趣(ROI)区域.如果是简易的矩形ROI区域其实是非常容易分割的,opencv的官方python教程里也有教到最简易的矩形ROI分割(剪裁),其本质是多维数组(矩阵)的切片.但是现实情况中,ROI是不规则的多边形,也可能是曲线边界,那么该如何分割出来呢?下面总结几种思路. 可能只提供核心部分的代码示例,具体应用要结合你自己的项目来修正. 一.已知边界坐标,直接画出多边形 例:最基础的画个四边形 # 定义四个顶点坐标 pts = np.array([[10

  • python opencv实现目标区域裁剪功能

    这个任务是自己在项目中数据处理的一部分内容,待处理的图片如下所示: 我需要将目标区域给裁剪出来,要不然在后期训练网络的时候整幅图像过大,且目标区域过小,得到结果不好,还会加剧计算量.在网上找了各个大佬的博客看,没找到合适的,便自己动手写了,顺便自己的小破站刚搭建起来,记录一下自己的思路. 思路 去寻找目标区域的最左边,最右边,最上面和最下面的像素点,取到坐标信息以后用CV2的裁剪一下就可以实现了. #难点 数据总共是11952张图片,每张图片是1024*768大小的,依次去遍历的话担心太费时间了

  • python opencv 二值化 计算白色像素点的实例

    贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import numpy as np from PIL import Image area = 0 def ostu(img): global area image=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度 blur = cv2.GaussianBlur(image,(5,5),0) # 阈值一定要设为 0 !高斯模糊 re

  • Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域ROI proimage = src.copy() #复制原图 """提取轮廓""" proimage=cv2.cvtColor(proimage,cv2.COLOR_BGR2GRAY) #转换成灰度图 proimage=cv2.adaptiveThre

  • Python+OpenCV图片局部区域像素值处理改进版详解

    上个版本的Python OpenCV图片局部区域像素值处理,虽然实现了我需要的功能,但还是走了很多弯路,我意识到图片本就是数组形式,对于8位灰度图,通道数为1,它就是个二位数组,这样就没有必要再设置ROI区域,复制出来这块区域再循环提取像素存入数组进行处理了,可以直接将图片存入数组,再利用numpy进行切分相应的数组操作就可以了,这样一想就简单很多了,这篇我会贴出修改后的代码,直接省去了大段的代码啊. ps:这次我重新装的opencv3.2.0版本,代码里面直接用cv2了 # 查看opencv版

随机推荐