python opencv(一):两个相交的多边形 膨胀操作之后,一系列计算求他们相交的面积

第一中例题:

两个相交的图像的多边形膨胀之后求膨胀之后的多边形的面积操作

导入模块信息

import cv2 as cv
import numpy as np 
from matplotlib import pyplot as plt

将多边形的信息写在多个图像信息中,并且分别对其进行膨胀操作

kernel = np.ones((10,10),np.uint8)  

points = [[10,20],[30,50],[40,80],[60,60],[90,10]]
poly = np.array(points)
img = np.zeros([400,400,3])
img = cv.fillPoly(img, [poly], (0, 0, 125))  #img,pts同上,实际代码只需要这三个参数即可,其他均有默认值
dilation_img = cv.dilate(img,kernel,iterations = 1) 


points2 = [[30,20],[30,50],[40,80],[60,90],[90,40]]
poly2 = np.array(points2)
img2 = np.zeros([400,400,3])
img2 = cv.fillPoly(img2, [poly2], (0, 0, 125))  #img,pts同上,实际代码只需要这三个参数即可,其他均有默认值
dilation_img2 = cv.dilate(img2,kernel,iterations = 1) 

膨胀操作完成之后,便可以对其求与操作,并且在与操作完成之后,可以得到两个图形相交的面积操作

# 膨胀之后的相交操作
img_and = cv.bitwise_and(dilation_img, dilation_img2)

# 求面积的方法一
# 根据相交图像中的信息从而得到大于零的像素个数也就是面积信息
and_area =np.sum(np.float32(np.greater(img_and,0)))
print("Intersection area:",and_area)

# 求面积的方法二
可以先求出相交区域的边缘信息,然后直接根据边缘信息直接计算面积信息
img = np.uint8(img_and)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 1, 255, cv.THRESH_BINARY)
contours, hierarchy = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
area = cv.contourArea(contours[0])
# 显示计算结果
print('Intersection area:', area)

第二种例题

相交多边形膨胀之后的buffer相交面积

import cv2 as cv
import numpy as np 
from matplotlib import pyplot as plt

kernel = np.ones((10,10),np.uint8)  

points = [[10,20],[30,50],[40,80],[60,60],[90,10]]
poly = np.array(points)
img = np.zeros([400,400,3])
img = cv.fillPoly(img, [poly], (0, 0, 125))  #img,pts同上,实际代码只需要这三个参数即可,其他均有默认值
dilation_img = cv.dilate(img,kernel,iterations = 1) 
buffer = cv.subtract(dilation_img, img)

points2 = [[30,20],[30,50],[40,80],[60,90],[90,40]]
poly2 = np.array(points2)
img2 = np.zeros([400,400,3])
img2 = cv.fillPoly(img2, [poly2], (0, 0, 125))  #img,pts同上,实际代码只需要这三个参数即可,其他均有默认值
dilation_img2 = cv.dilate(img2,kernel,iterations = 1) 
buffer2 = cv.subtract(dilation_img2, img2)


# img2 = np.zeros([400,400,3])
cv_show("result",buffer2)


## 下面还是求面积的操作,还是同样的方式但是不同
img_and = cv.bitwise_and(buffer, buffer2)
# 求面积的方法一
# 根据相交图像中的信息从而得到大于零的像素个数也就是面积信息
and_area =np.sum(np.float32(np.greater(img_and,0)))
print("Intersection area:",and_area)


将两个buffer 显示在一个图像当中

# 将两个图像相加,权重分别为0.5和0.5
result = cv.addWeighted(buffer, 0.5, buffer2, 0.5, 0)
# 显示结果图像
cv.imshow('Merged Image', result)
cv.waitKey(0)
cv.destroyAllWindows()

关于开、闭运算

     先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体,这样容易记住),其作用是:分离物体,消除小区
域。这类形态学操作用 cv2.morphologyEx() 函数实现

openCV中绘制线条

plyline中的点的坐标信息必须是三元数组信息

points = [[10,20],[30,50],[40,80],[60,60],[90,10]]
poly = np.array(points)
img = np.zeros([400,400,3])

# 绘制多边形的边
# 此处的边信息必须为三元组 [[  [],[],[],[],[],[]  ]]
cv.polylines(img, [poly], True, (255, 255, 255), 2)     # True表示该图形为封闭图形
cv_show('Polygon', img)


# 获取图像的轮廓信息,然后在绘制图像信息
img = np.uint8(img_and)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 1, 255, cv.THRESH_BINARY)
contours, hierarchy = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)


cv.drawContours(img_and,contours, -1, 255, thickness=-1)
cv_show("相交",img_and)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值