OPENCV判断图像中目标物位置及多目标物聚类
文章目录
在最近的项目中,又碰到一个有意思的问题需要通过图像算法来解决。就是显微拍摄的到的医疗图像中,有时候目标物比较偏,也就是在图像的比较偏的位置,需要通过移动样本,将目标物置于视野正中央,然后再次进行拍摄。
就类似于下面的图像:

基于这个需求,在图像上就需要使用图像算法进行判断(没有必要使用深度网络的时候就不要用,太浪费资源了)。
对于上面的图像,基本的处理逻辑是:
- 因为目标物是细胞,也就是图中的一个一个的圈圈,需求就是要让尽可能多的细胞位于图像正中央。
- 目标物的粘连比较少,所以基于阈值分割的基本逻辑应该是可以将所需要的目标物提取出来(这一块在python的opencv操作记录11——阈值分割这一篇已经讲过了)。
- 分割完之后再通过opencv提取轮廓的方法将轮廓提取出来。
- 提取完轮廓之后,对每个轮廓求外接矩形。
- 利用业务特性对相应的轮廓做一些过滤操作。
- 将多个矩形做一个聚类,这里可以有多种聚类方案,可以先聚类再筛选,也可以根据某个逻辑确定一个质心,然后再根据这个质心再做聚类。
- 然后就是调参工作了。
我自己的代码为:
int getCenter(cv::Mat img, cv::Rect& resultRect)
{cv::cvtColor(img, img, cv::COLOR_RGB2GRAY);// 阈值分割cv::threshold(img, img, 50, 255, cv::THRESH_BINARY);// 提取轮廓std::vector<cv::Mat> contours;cv::findContours(img, contours, cv::RETR_LIST, cv::CHAIN_APPROX_NONE);// 逐步聚类的方法std::vector<float> xs, ys;// 初始化质心float centroid_x = 0.0f, centroid_y = 0.0f;// 找到第一个质心,我这里是使用面积最大的作为第一个质心,代码没有贴上来int maxIndex = 0;float maxSocre = 0.0f;// 迭代计算质心for (int i = 0; i < contours.size(); i++){score = cv::contourArea(contours[i]);// 判断是一个有效区域if (score > threshold_score){cv::Rect rect = cv::boundingRect(contours[i]);// 判断是否离中心比较远, 第一次不做判断if (abs(rect.x + (rect.width / 2) - centroid_x) > centroidThresholdX){continue;}if (abs(rect.y + (rect.height / 2) - centroid_y) > centroidThresholdY){continue;}// 纳入下一次的质心计算xs.push_back(rect.x + rect.width / 2);ys.push_back(rect.y + rect.height / 2);float tempCenterX = 0.0f;for (int x = 0; x < xs.size(); x++){tempCenterX += xs[x];}centroid_x = tempCenterX / xs.size();float tempCenterY = 0.0f;for (int y = 0; y < ys.size(); y++){tempCenterY += ys[y];}centroid_y = tempCenterY / ys.size();}}for(int z = 0; z < xs.size(); z++){ if (xs[z] < minX){minX = xs[z];}if (xs[z] > maxX){maxX = xs[z];}if (ys[z] < minY){minY = ys[z];}if (ys[z] > maxY){maxY = ys[z];}}std::cout << "maxX:" << maxX << "minX:" << minX << "maxY:" << maxY << "minY:" << minY << std::endl;resultRect.x = minX;resultRect.y = minY;resultRect.width = maxX - minX;resultRect.height = maxY - minY;return 0;
}
最后的结果是:

调整的距离就是这个矩形的中央到整个图像的中央坐标了。
相关文章:
OPENCV判断图像中目标物位置及多目标物聚类
文章目录 在最近的项目中,又碰到一个有意思的问题需要通过图像算法来解决。就是显微拍摄的到的医疗图像中,有时候目标物比较偏,也就是在图像的比较偏的位置,需要通过移动样本,将目标物置于视野正中央,然后再…...
分布式理论:拜占庭将军问题
分布式理论:拜占庭将军问题 介绍拜占庭将军的故事将军的难题 解决方案口信消息型拜占庭问题之解流程总结 签名消息型拜占庭问题之解 总结 介绍 拜占庭将军问题是对分布式共识问题的一种情景化描述,由兰伯特于1082首次发表《The Byzantine Generals Prob…...
从零开始Ubuntu24.04上Docker构建自动化部署(三)Docker安装Nginx
安装nginx sudo docker pull nginx 启动nginx 宿主机创建目录 sudo mkdir -p /home/nginx/{conf,conf.d,html,logs} 先启动nginx sudo docker run -d --name mynginx -p 80:80 nginx 宿主机上拷贝docker上nginx服务上文件到本地目录 sudo docker cp mynginx:/etc/nginx/ngin…...
阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战
作者:胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件,这个事件是 K8s 原生的事件,其实绝大多数的用户并不会关心,同时也可能看不懂。而事件中心,是希望能够…...
人口普查管理系统基于VUE+SpringBoot+Spring+SpringMVC+MyBatis开发设计与实现
目录 1. 系统概述 2. 系统架构设计 3. 技术实现细节 3.1 前端实现 3.2 后端实现 3.3 数据库设计 4. 安全性设计 5. 效果展示 编辑编辑 6. 测试与部署 7. 示例代码 8. 结论与展望 一个基于 Vue Spring Boot Spring Spring MVC MyBatis 的人口普查管理…...
使用VBA快速将文本转换为Word表格
Word提供了一个强大的文本转表格的功能,结合VBA可以实现文本快速转换表格。 示例文档如下所示。 现在需要将上述文档内容转换为如下格式的表格,表格内容的起始标志为。 示例代码如下。 Sub SearchTab()Application.DefaultTableSeparator "*&quo…...
力扣题解1870
这道题是一个典型的算法题,涉及计算在限制的时间内列车速度的最小值。这是一个优化问题,通常需要使用二分查找来求解。 题目描述(中等) 准时到达的列车最小时速 给你一个浮点数 hour ,表示你到达办公室可用的总通勤时…...
D3.js数据可视化基础——基于Notepad++、IDEA前端开发
实验:D3.js数据可视化基础 1、实验名称 D3数据可视化基础 2、实验目的 熟悉D3数据可视化的使用方法。 3、实验原理 D3 的全称是(Data-Driven Documents),是一个被数据驱动的文档,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。本次实…...
在Robot Framework中Run Keyword If的用法
基本用法使用 ELSE使用 ELSE IF使用内置变量使用Python表达式本文永久更新地址: 在Robot Framework中,Run Keyword If 是一个条件执行的关键字,它允许根据某个条件来决定是否执行某个关键字。下面是 Run Keyword If 的基本用法: Run Keyword…...
虚拟机ip突然看不了了
打印大致如下: 解决办法 如果您发现虚拟机的IP地址与主机不在同一网段,可以采取的措施之一是调整网络设置。将虚拟机的网络模式更改为桥接模式,这样它就会获得与主机相同的IP地址,从而处于同一网段。或者,您可以使用…...
LeetCode[中等] 763. 划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路 贪心…...
Java LeetCode每日一题
997. 找到小镇的法官 package JavaExercise20241002;public class JavaExercise {public static void main(String[] args) {int[][] array {{1,3},{2,3},{3,1}};Solution solution new Solution();System.out.println(solution.findJudge(3, array));} }class Solution {pu…...
数据结构--集合框架
目录 1. 什么是集合框架 2. 背后所涉及的数据结构以及算法 2.1 什么是数据结构 2.2 容器背后对应的数据结构 1. 什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 int…...
Win10鼠标总是频繁自动失去焦点-非常有效-重启之后立竿见影
针对Win10鼠标频繁自动失去焦点的问题,可以尝试以下解决方案: 一、修改注册表(最有效的方法-重启之后立竿见影) 打开注册表编辑器: 按下WindowsR组合键,打开运行窗口。在运行窗口中输入“regedit”&#x…...
智能涌现|迎接智能时代,算力产业重构未来
前言 OpenAI首席执行官山姆奥特曼在《智能时代》中描绘了一个令人振奋的未来图景,其中算力产业将扮演至关重要的角色。奥特曼预测,我们可能在“几千天内”迎来超级智能,这一进程将极大加速社会结构的智能化转型。 这一预测与算力产业的未来…...
关于HTML 案例_个人简历展示01
案例效果展示 代码 <!DOCTYPE html> <lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个人简历信息</title> </he…...
【前端开发入门】css快速入门
目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…...
java中创建不可变集合
一.应用场景 二.创建不可变集合的书写格式(List,Set,Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…...
D25【 python 接口自动化学习】- python 基础之判断与循环
day25 for 循环 学习日期:20241002 学习目标:判断与循环﹣-35 for 循环:如何遍历一个对象里的所有元素? 学习笔记: for 循环与while循环的区别 for循环的定义 使用for循环遍历序列 使用for循环遍历字典…...
HTTP1.0和HTTP1.1有什么区别
HTTP/1.0 和 HTTP/1.1 是两个不同版本的 HTTP 协议。虽然它们的核心功能都是提供网页数据传输,但 HTTP/1.1 对 HTTP/1.0 做了很多改进,提升了性能和灵活性。以下是它们的主要区别: 1. 持久连接(Persistent Connection)…...
汽车电子安全:从CAN总线到纵深防御的嵌入式安全实战
1. 从“汽车黑客”到“数字堡垒”:一位嵌入式工程师的十年安全观演进十多年前,当EE Times那场关于“汽车黑客是否值得担忧”的在线聊天发起时,我正埋头于一个汽车ECU(电子控制单元)的底层驱动开发。彼时,“…...
OpenClaw快速上手:从第一次对话到第一个自动化任务
OpenClaw快速上手:从第一次对话到第一个自动化任务 版本说明:本文基于OpenClaw 2026.3.2版本编写。该版本经过充分验证,稳定可靠,且预装了49个内置技能,本文的演示将主要依赖这些技能。 在OpenClaw的官方教程中&#x…...
别再死记硬背了!用GNS3/EVE-NG模拟BGP、OSPF、RIP混合组网,带你理解路由选路优先级
动态路由协议实战:用GNS3/EVE-NG解密BGP、OSPF、RIP选路逻辑 当你面对一个同时运行BGP、OSPF和RIP的复杂网络时,路由器究竟如何选择最佳路径?这个看似基础的问题,却让无数网络工程师在深夜排障时抓狂。传统教材中那些枯燥的AD值表…...
OpenAPI规范自动生成CLI工具:原理、实现与工程实践
1. 项目概述:从API文档到命令行工具的自动化革命如果你是一名后端开发者,或者经常需要与各种RESTful API打交道,那么下面这个场景你一定不陌生:产品经理或前端同事跑过来,递给你一份新鲜出炉的OpenAPI/Swagger规范文档…...
FPGA以太网MAC调试架构设计与DSP优化实践
1. 项目概述:FPGA与以太网MAC的DSP调试架构在数字信号处理(DSP)的硬件实现中,调试环节往往成为开发效率的瓶颈。传统JTAG调试方式受限于带宽和灵活性,难以满足大规模数据交互的需求。我们基于Xilinx Virtex-4 FPGA平台…...
量子机器学习框架互操作性挑战与解决方案
1. 量子机器学习框架互操作性挑战与解决方案量子机器学习(QML)作为量子计算与经典机器学习的交叉领域,近年来在理论和实践层面都取得了显著进展。变分量子算法(VQAs)和参数化量子电路(PQCs)已成…...
基于微信小程序的家政服务预约系统(30291)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
规范驱动开发:基于OpenAPI与LLM的现代API构建实践
1. 项目概述:一个基于规范驱动的现代API开发实践最近在GitHub上看到一个挺有意思的项目,叫izzymsft/spec-driven-dev-backend-apis,它是一个用FastAPI构建的客户管理后端REST API。这个项目本身的功能——客户和地址的CRUD操作,结…...
AI技能树:构建系统化学习路径,从理论到工程实践
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“HieuNghi-AI-Skills”。光看这个名字,可能有点摸不着头脑,但点进去之后,我发现这其实是一个关于AI技能学习的资源集合库。简单来说,它就是一个由社区驱…...
边缘AI实战:从医疗到零售的系统级挑战与软硬件协同设计
1. 项目概述:当AI走出云端,走进现实“边缘AI”这个词,现在听起来可能已经不新鲜了,但真正把它从概念变成手边可用的工具,甚至是一个能独立决策的“小脑”,这个过程里踩过的坑、绕过的弯,可能比想…...
