# coding=utf-8
# 先读图,然后二值化,
# 矩形度,
import cv2
import math
import numpy as np
# 此处读入图片,作为接口
pic_name = 'picture/butterfly0.jpg'
origin = cv2.imread(pic_name)
grayimage = cv2.imread(pic_name, 0)
# species = 'wo'
# 高斯滤波
blur = cv2.GaussianBlur(grayimage, (5, 5), 0)
# 二值化:用大津法,此处选项若是THRESH_BINARY_INV,则同意选用白色背景的图片样本
ret, otsu = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 找轮廓
contours = cv2.findContours(otsu, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 轮廓集数目
largest_area = 0
largest_contour_index = 0
num = len(contours[1])
for i in range(num):
area = cv2.contourArea(contours[1][i], False)
if area > largest_area:
largest_area = area
largest_contour_index = i
maxContour = contours[1][largest_contour_index]
# 画轮廓
cv2.drawContours(origin, maxContour, -1, (0, 0, 255), 2)
print "最大面积" + str(largest_area)
# 矩形度*****************************************************
# 矩形度*****************************************************
# 矩形度*****************************************************
# 矩形度*****************************************************
# 查找最小外接矩形
minAreaRect = cv2.minAreaRect(maxContour)
box = cv2.boxPoints(minAreaRect)
box = np.int0(box)
# 画轮廓
cv2.drawContours(origin, [box], 0, (0, 255, 0), 2)
# 计算最小外接矩形面积
minAreaRect_Area = int(cv2.contourArea(box, False))
print "最小外接矩形面积" + str(minAreaRect_Area)
# 特征一:矩形度的计算
P_Rect = largest_area * 1.0 / minAreaRect_Area
# 统一结果为3位小数
P_Rect = round(P_Rect, 3)
print "矩形度" + str(P_Rect)
# 延长度***************************************************************************************************
# 延长度***************************************************************************************************
# 延长度***************************************************************************************************
# 延长度***************************************************************************************************
# 质心计算
M = cv2.moments(maxContour)
Centroid_x = int(M['m10'] / M['m00'])
Centroid_y = int(M['m01'] / M['m00'])
print "质心" + str(Centroid_x) + " " + str(Centroid_y)
cv2.circle(origin, (Centroid_x, Centroid_y), 3, (255, 255, 255), -1)
# 获取长轴
Major_Axis_Length = 0
Major_Axis_Angle = 0
Major_Axis_End_x = 0
Major_Axis_End_y = 0
Major_Axis_Begin_x = 0
Major_Axis_Begin_y = 0
# 此处需要注意质心是否在轮廓内
# 找长轴
for angle in range(180):
theta = angle * 3.14 / 180.0
lengthBackward = 0
lengthForward = 0
point_End_x = Centroid_x
point_End_y = Centroid_y
point_Begin_x = Centroid_x
point_Begin_y = Centroid_y
# 步进越小准确率越高,设置成1可以先找到准确的直线角度,再根据角度和质心得到的直线计算出正确的长轴和轮廓交点
while cv2.pointPolygonTest(maxContour, (point_End_x, point_End_y), False) > 0:
lengthForward = lengthForward + 0.1
point_End_x = int(round(point_End_x + lengthForward * math.cos(theta)))
point_End_y = int(round(point_End_y + lengthForward * math.sin(theta)))
while cv2.pointPolygonTest(maxContour, (point_Begin_x, point_Begin_y), False) > 0:
lengthBackward = lengthBackward + 0.1
point_Begin_x = int(round(point_Begin_x - lengthBackward * math.cos(theta)))
point_Begin_y = int(round(point_Begin_y - lengthBackward * math.sin(theta)))
if lengthForward + lengthBackward >= Major_Axis_Length:
Major_Axis_Length = lengthForward + lengthBackward
Major_Axis_Angle = angle
Major_Axis_End_x = point_End_x
Major_Axis_End_y = point_End_y
Major_Axis_Begin_x = point_Begin_x
Major_Axis_Begin_y = point_Begin_y
# 计算实际长轴长度
Real_Major_Axis_Length = math.sqrt(
math.pow((Major_Axis_End_x - Major_Axis_Begin_x), 2) + math.pow((Major_Axis_End_y - Major_Axis_Begin_y), 2))
Real_Major_Axis_Length = round(Real_Major_Axis_Length, 1)
print "长轴长度 = " + str(Real_Major_Axis_Length)
print "长轴角度 = " + str(Major_Axis_Angle)
# print "起点 = " + "x: " + str(Major_Axis_Begin_x) + " y: " + str(Major_Axis_Begin_y)
# print "起点 = " + "x: " + str(Major_Axis_End_x) + " y: " + str(Major_Axis_End_y)
# 画长轴
cv2.line(origin, (Major_Axis_Begin_x, Major_Axis_Begin_y), (Major_Axis_End_x, Major_Axis_End_y), (255, 0, 0), 2)
# 找短轴
# 1. 先得到长轴直线的表达式y=k*x+b,用来计算点到直线距离和判断点在直线上方还是下方
Major_Axis_k = math.tan(Major_Axis_Angle * 3.14 / 180.0)
Major_Axis_b = Centroid_y - Major_Axis_k * Centroid_x
# 2. 点(x0,y0)到直线(Ax+By+C=0)的距离为d =abs (A*x0+B*y0+C)/sqrt(A^2+B^2)
Minor_Axis_A = Major_Axis_k
Minor_Axis_B = -1
Minor_Axis_C = Major_Axis_b
# 3. 遍历轮廓上的点
Minor_Axis_Under_length = 0
Minor_Axis_Above_length = 0
Minor_Axis_Under_End_x = 0
Minor_Axis_Under_End_y = 0
Minor_Axis_Above_End_x = 0
Minor_Axis_Above_End_y = 0
# 轮廓点集
ContourItems = maxContour.shape[0]
for item in range(ContourItems):
point_x = maxContour[item][0][0]
point_y = maxContour[item][0][1]
# 判断点在直线哪一侧
# 上侧
if point_y > int(Major_Axis_k * point_x + Major_Axis_b):
# 点到直线距离
dis = abs((Minor_Axis_A * point_x + Minor_Axis_B * point_y + Minor_Axis_C) / math.sqrt(
Minor_Axis_A * Minor_Axis_A + Minor_Axis_B * Minor_Axis_B))
if dis >= Minor_Axis_Above_length:
Minor_Axis_Above_length = dis
Minor_Axis_Above_End_x = point_x
Minor_Axis_Above_End_y = point_y
# 下侧
elif point_y < int(Major_Axis_k * point_x + Major_Axis_b):
# 点到直线距离
dis = abs((Minor_Axis_A * point_x + Minor_Axis_B * point_y + Minor_Axis_C) / math.sqrt(
Minor_Axis_A * Minor_Axis_A + Minor_Axis_B * Minor_Axis_B))
if dis >= Minor_Axis_Under_length:
Minor_Axis_Under_length = dis
Minor_Axis_Under_End_x = point_x
Minor_Axis_Under_End_y = point_y
# 第三种可能就是轮廓与直线的交点
# # 标记两个点,可以忽略
cv2.circle(origin, (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y), 4, (255, 255, 255), -1)
cv2.circle(origin, (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y), 4, (255, 255, 255), -1)
# 画出两点直线
cv2.line(origin, (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y), (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y),
(0, 255, 255), 3)
# 计算实际短轴长度
Real_Minor_Axis_Length = math.sqrt(
math.pow((Minor_Axis_Above_End_x - Minor_Axis_Under_End_x), 2) + math.pow(
(Minor_Axis_Above_End_y - Minor_Axis_Under_End_y), 2))
Real_Minor_Axis_Length = round(Real_Minor_Axis_Length, 1)
print "短轴长度 = " + str(Real_Minor_Axis_Length)
# 特征二:延长度的计算
P_extend = Real_Major_Axis_Length * 1.0 / Real_Minor_Axis_Length
P_extend = round(P_extend, 3)
print "延长度 = " + str(P_extend)
# 画出与长轴距离最远的两点的辅助线,使用时可以不用,画图用作论文使用
# 画出长轴右方
line_above_k = math.tan((Major_Axis_Angle - 90) * 3.14 / 180.0)
line_above_b = Minor_Axis_Above_End_y - line_above_k * Minor_Axis_Above_End_x
Minor_Axis_Above_Begin_x = int((line_above_b - Major_Axis_b) / (Major_Axis_k - line_above_k))
Minor_Axis_Above_Begin_y = int(line_above_k * Minor_Axis_Above_Begin_x + line_above_b)
cv2.line(origin, (Minor_Axis_Above_Begin_x, Minor_Axis_Above_Begin_y), (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y),
(255, 0, 255), 3)
line_under_k = math.tan((Major_Axis_Angle - 90) * 3.14 / 180.0)
line_under_b = Minor_Axis_Under_End_y - line_under_k * Minor_Axis_Under_End_x
Minor_Axis_Under_Begin_x = int((line_under_b - Major_Axi

onnx
- 粉丝: 1w+
最新资源
- 计算机视觉_深度学习_图像分割_onnxruntime推理框架_MODNet人像背景分割_C实现_长宽等比例输入_CPU优化_实时性能提升_700毫秒每帧_输入尺寸限制修复_人.zip
- CH3OHJCY_-matlab-Maxwell_29992_1752553883066.zip
- boxytt_GeneticAlgorithm_13372_1752553739812.zip
- lin-dodo_GA_test_18800_1752553784478.zip
- 《计算机网络》大学生期末复习题及答案三套
- 计算机视觉_深度学习_图像视频背景抠图_MODNet模型实现_基于PyTorch框架的高精度实时人像抠图工具_支持视频与图片背景替换_无需绿幕即可实现专业级抠图效果_适用于视频会议.zip
- 机器人仿真与导航系统_ROS机器人操作系统_Gazebo仿真环境_激光雷达SLAM建图_蒙特卡洛定位算法_move_base路径规划_自适应导航控制_真实机器人集成_开源参考实现_.zip
- 计算智能与组合优化_遗传算法_粒子群优化_蚁群优化_旅行商问题求解_基于Python实现的三种智能优化算法对比研究_包括算法原理分析_参数调优策略_收敛性比较_路径质量评估_多维度.zip
- 计算智能与优化算法_遗传算法_粒子群优化_蚁群算法_差分进化_多目标优化_并行计算_旅行商问题_中国34城市路径规划_智能物流配送_交通网络优化_算法性能对比_参数调优_收敛性分析.zip
- 计算智能与优化算法_遗传算法与进化计算_基于Matlab的智能优化系统开发与多目标函数求解_用于解决复杂工程优化问题如参数调优路径规划资源分配并提供可视化分析工具支持科研教学与工业.zip
- 建筑结构优化与计算设计_遗传算法_ANSYS有限元分析_Grasshopper参数化建模_Rhino三维建模_悬支穹顶形态分析_多目标优化_结构性能评估_自由曲面找形_建筑力学仿真.zip
- 人工智能_遗传算法_神经网络_自主驾驶_基于遗传算法优化神经网络模型的智能小车自主驾驶学习系统_通过模拟自然选择过程训练小车在虚拟赛道中自主行驶并不断优化其行驶策略_实现无需人工干.zip
- 结构工程_遗传算法优化_桥梁人致振动控制_基于模态分析与调谐质量阻尼器参数优化的行人荷载作用下大跨度钢结构人行桥振动控制与舒适度提升系统_包含TMD参数自动寻优算法_人行荷载时程分.zip
- 人工智能与计算智能_进化算法与群体智能优化_遗传算法与粒子群优化混合策略_用于解决复杂工程优化问题的自适应多目标优化框架及其在智能制造系统参数调优中的应用研究.zip
- 人工智能与优化算法_启发式搜索与元启发式算法_遗传算法_模拟退火_爬山法_回溯法_N皇后问题求解器_用于解决NP完全问题的多种启发式算法实现与比较分析_包含可视化界面展示不同算法在.zip
- 石油化工生产调度优化_遗传算法与多目标优化_原油短期调度计划与资源配置_基于智能算法的炼油厂生产排程系统设计与实现_用于提高炼油企业生产效率降低运营成本的原油加工调度优化解决方案_.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
- 4
前往页