返回顶部
首页 > 资讯 > 后端开发 > Python >对象发现
  • 369
分享到

对象发现

对象发现 2023-01-31 00:01:24 369人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

近段时间,做了一些关于对象发现的工作。主要内容是从图片中识别出液滴,并统计其数量。在这个过程中遇到了一些问题,也发现了几种相关的解决方案,在这里与大家分享一下。 python中用来处理图像的不得不说CV2 了,这是一个工业级的包。包含

近段时间,做了一些关于对象发现的工作。主要内容是从图片中识别出液滴,并统计其数量。在这个过程中遇到了一些问题,也发现了几种相关的解决方案,在这里与大家分享一下。

python中用来处理图像的不得不说CV2 了,这是一个工业级的包。包含了几乎所有的图片处理方法,例如常见的找边界、膨胀、腐蚀、画矩形、画圆等。本次实践过程我使用到了三种方法,用来识别图像中的液滴。第一种是常规的处理方法,先对图片进行边界确定,然后膨胀、腐蚀,最后寻找液滴;第二种方法是由于第一中方法会将边缘勿识别为液滴,故在第一种方法的基础上加上边缘界定,想借此消除边界误差;第三种是用多个液滴模板,一次对图片进行匹配,如果相似度在阈值内则认为是目标液滴,否则不是。

实例背景:我们需要从一张显微镜拍下的分液图中寻找出液滴,并统计数量。

1. 常规方法--膨胀+腐蚀  
2. 先界定边缘然后膨胀+腐蚀  
3. 遮罩匹配  

常规方法

常规方法中,关键在与图片处理的流程。在这里,我们的图片存在色差不明显和颜色偏淡的情况,为此,我们首先对图片做颜色增强操作。(此前对比了锐化操作,对结果没有明显的提升)接着开始做寻找图片中对象的操作。首先,使用cv2.cvtColor方法将图片转化为灰度图,使用cv2.Canny 方法找出对象的边界;然后,使用cv2.dilate 方法进行膨胀操作;紧接着,使用cv2.erode 方法进行腐蚀操作;最后,使用cv2.findContours 方法找出图片中的对象。在可视化部分,我们使用cv2.drawContours 方法绘出我们找到的对象,与实际情况对比,观察误差存在的区域以及特点。下面给出每一步操作的代码。

导入包
import numpy as np
from PIL import ImageEnhance,Image
import cv2
import os
import sys

首先我们定义了颜色增强的方法

def EnhanceImage(image):
#色度增强
enh_col = ImageEnhance.Color(image);
color = 1.5;
image_colored = enh_col.enhance(color);

return np.array(image_colored);

image_enhance = EnhanceImage(image);

找到对象轮廓

image_to_process = image_enhance[:,:,:3];
image_gray = cv2.cvtColor(image_to_process, cv2.COLOR_BGR2GRAY);
image_cannyEdged = cv2.Canny(image_gray, 50, 120);

膨胀

dilatekernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)); #定义膨胀核的形状
image_dilateEdged = cv2.dilate(image_cannyEdged, dilatekernel, iterations=2); #膨胀

腐蚀

errodekernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(8,8)); #定义腐蚀核形状
image_erodeEdged = cv2.erode(image_dilateEdged, errodekernel, iterations=1); #腐蚀

标记对象
因为图片中存在噪点,我们为了让对象查找更加精准,进行了对象筛选步骤。我们根据对象的面积来判断其是否是一个正常的目标点。

定义筛选函数
def ContourFilter(contours,min_area,max_area,rate):
"""
contours 轮廓位置坐标数组
min_area 轮廓围成的区域的最小面积
max_area 轮廓围成的区域的最大面积
轮廓先要满足min_area 和 max_area 条件,然后需要满足包含轮廓的最小矩形的长宽比小于rate
"""
con = [];
for c in contours:
a = cv2.contourArea(c);
if((a > min_area) and (a < max_area)):
min_rect = cv2.minAreaRect(c);
#width 不一定比 height 小
width = min_rect[1][0];
height = min_rect[1][1];
if(not (width/height > rate or height/width > rate)):
con.append(c);
else:
continue;
return con;

寻找对象

contours, hierarchy = cv2.findContours(image_erodeEdged, cv2.RETR_LIST, cv2.CHaiN_APPROX_NONE);#cv2.findCountours 方法返回值的个数与cv2的版本有关。可能是2个也肯是3个,具体情况根据自身cv2版本调整
contours_filter = ContourFilter(contours,3.5,50,2.5);
number = 0;
for cnt in contours_filter:
min_rect = cv2.minAreaRect(cnt);
min_rect = np.int0(cv2.boxPoints(min_rect));
cv2.drawContours(image_contours,[min_rect],-1,(12,12,12),2);
number = number + 1;

从图中,我们可以看到,标记出的对象中存在一定的误差,边缘部分有噪点。用常规方法发现对象,在很大程度上依赖cv2.Canny 方法,及以来cv2 库中寻找边界的方法。如果,边界能被精确识别,那么对象发现将会是零误差。因为我们后续操作都是建立在边界轮廓上。从图片的边界图中我们发现,边缘的边界识别存在很大的误差,出现多层边界。边界不是一条封闭的曲线。内部边界也有类似的情况。由于边界识别出现误差,导致在膨胀和腐蚀时边界会出现不规则的形状。甚至将正常点分化为噪点。为解决该问题,我们尝试了新方法;

界定边缘+膨胀+腐蚀

定义边界发现函数
def segment_on_dt(a, img):
border = cv2.dilate(img, None, iterations=5);
border = border - cv2.erode(border, None);

dt = cv2.distanceTransfORM(img, 2, 3);
dt = ((dt - dt.min()) / (dt.max() - dt.min()) * 255).astype(np.uint8);
_, dt = cv2.threshold(dt, 180, 255, cv2.THRESH_BINARY);
lbl, ncc = label(dt);
lbl = lbl * (255 / (ncc + 1));
# Completing the markers now.
lbl[border == 255] = 255 ;

lbl = lbl.astype(np.int32);
print(lbl.shape);
cv2.watershed(a, lbl);

lbl[lbl == -1] = 0;
lbl = lbl.astype(np.uint8);
return 255 - lbl;

def fill(img,n=4):
"""
fill the edge
default 4 neighborhood
"""
neighbor = get_neighbor(n);
w,h = img.shape;
img_copy = img.copy();
for i in range(1,w-1):
for j in range(1,h-1):
if(img[i][j] == 255): #白色点
for ne in neighbor:
img_copy[i+ne[0],j+ne[1]] = 255;
return img_copy;

def get_neighbor(n):
if(n==4):
return [(-1,0),(1,0),(0,-1),(0,-1)];
if(n==8):
return [(-1,0),(1,0),(0,-1),(1,0),(-1,-1),(1,1),(-1,1),(1,-1)];
return [];

从结果上看,图片中存在区块色差。为此我们任然无法精确识别边界,该方法最终被我们放弃。新的方法总会产生,经过查阅资料,发现了一种通过遮罩模板的方法直接匹配目标点。这个方法简单直接,缺点就是我们需要选出许多遮罩模板,对于没有出现过的目标点则显得无能为力。其中需要解决的问题有两个,1是选出合适的遮罩模板;2是需要将每个遮罩模板匹配出的结果合并。

遮罩匹配

该方法主要使用到cv2.matchTemplate 方法,匹配度计算的标准有方差,相关系数。详细用法可以参考cv2.matchTemplate 教程

template_result = cv2.matchTemplate(image, mask, cv2.TM_CCOEFF_NORMED);
loc = np.where(template_result >= 0.75);

从图中我们看见,使用遮罩模板选出的对象点的正确率基本达到100%。当然,这是在图片不复杂的情况下,如果图片存在噪点较多,目标点的颜色多样,那么这时我们必须增加遮罩模板的数量与种类。
总的来说,对象发现问题还有需要值得研究的地方。项目源码请看GitHub

--结束END--

本文标题: 对象发现

本文链接: https://lsjlt.com/news/181471.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 对象发现
    近段时间,做了一些关于对象发现的工作。主要内容是从图片中识别出液滴,并统计其数量。在这个过程中遇到了一些问题,也发现了几种相关的解决方案,在这里与大家分享一下。 python中用来处理图像的不得不说CV2 了,这是一个工业级的包。包含...
    99+
    2023-01-31
    对象 发现
  • Python面向对象怎么创建对象和给对象发消息
    这篇文章主要介绍“Python面向对象怎么创建对象和给对象发消息”,在日常操作中,相信很多人在Python面向对象怎么创建对象和给对象发消息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python面向对象怎...
    99+
    2023-06-01
  • PHP中如何实现对象的并发操作?
    在PHP中,对象的并发操作是一个非常重要的主题,因为它可以提高应用程序的性能和响应速度。在本文中,我们将讨论如何在PHP中实现对象的并发操作。 首先,让我们先了解一下PHP中的并发操作是什么意思。简单来说,并发操作是指多个线程或进程同时执行...
    99+
    2023-10-22
    对象 并发 shell
  • DjangoJSonResponse对象的实现
    目录HttpResponseJsonResponse总结JsonResponse 是 HttpResponse 的子类,与父类的区别在于: JsonResponse 默认 Conte...
    99+
    2023-03-23
    Django JSonResponse对象 Django JSonResponse
  • JavaScript之BOM location对象+navigator对象+history 对象
    目录一、location对象1、URL2、location 对象的属性3、location 对象的方法二、navigator对象三、history对象前言: window 对象给我们...
    99+
    2024-04-02
  • Java并发编程之对象的共享怎么实现
    这篇文章主要介绍“Java并发编程之对象的共享怎么实现”,在日常操作中,相信很多人在Java并发编程之对象的共享怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程之对象的共享怎么实现”的疑...
    99+
    2023-06-29
  • Java 中的存储机制:如何实现并发对象?
    Java 是一种广泛使用的编程语言,其具有高效性、可靠性和安全性。在 Java 中,对象是存储在堆上的。在多线程应用程序中,对象的并发性是非常重要的。在本文中,我们将介绍 Java 中的存储机制,以及如何实现并发对象。 Java 中的存储...
    99+
    2023-08-14
    存储 并发 对象
  • 二维码开发技术:PHP的对象方法实现
    二维码(QR code)是一种二维条码,可以存储更多的信息。它已经成为现代生活中不可或缺的一部分,例如支付、扫码领券、扫码登录等。在本文中,我们将探讨如何使用PHP的对象方法来实现二维码开发技术。 PHP QR Code库 PHP Q...
    99+
    2023-07-08
    二维码 开发技术 对象
  • BOM 探索:发现浏览器对象的奇妙世界
    BOM 中的另一个重要对象是 document 对象,它表示当前页面中的 HTML 文档。document 对象包含许多属性和方法,可以用于访问和操作 HTML 元素。例如,我们可以使用 document.getElementById()...
    99+
    2024-02-21
    BOM 中最重要的对象是 window 对象 它表示浏览器窗口。window 对象包含许多属性和方法 可以用于控制浏览器窗口。例如 我们可以使用 window.open() 方法打开一个新窗口 使用
  • node.js exports对象指南:轻松实现模块化开发
    exports 对象的工作原理 当您使用 require() 函数加载一个模块时,Node.js 会创建一个新的对象来表示该模块。这个对象包含一个 exports 属性,指向另一个对象。这个 exports 对象就是您用来导出变量和函数的...
    99+
    2024-04-02
  • Python全栈开发之面向对象
    No.1 概念 面向对象的特点? 注重对象和指责,不同的对象承担各自的指责 更加适合对复杂的需求变化,专门应对复杂项目开发,提供固定的套路 面向对象强调的是谁来做,面向过程强调的如何做 什么是类 类是对一群具有相同特征或者行为的事物统称,是...
    99+
    2023-01-31
    面向对象 Python
  • python 面向对象、类、对象
    class 类 object 对象 object-oriented programming 面向对象,简称OOP attribute 属性 method 方法 inheritance 继承 python中通过类和对象来实现 ...
    99+
    2023-01-31
    面向对象 对象 python
  • 如何将JavaScript对象转成jQuery对象数组对象
    JavaScript 是一种高级的动态编程语言,非常流行。它使得网页在不需要刷新页面的情况下变得更加动态和交互性。然而,当 JavaScript 开发变得越来越复杂,常常需要处理大量的 HTML 元素,这时候就需要用到 jQuery。jQu...
    99+
    2023-05-14
  • C++如何实现对象池
    这篇“C++如何实现对象池”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“C++如何实现对象池”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入主题吧。前言需求...
    99+
    2023-06-26
  • Django JSonResponse对象如何实现
    这篇“Django JSonResponse对象如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Django...
    99+
    2023-07-05
  • dom对象是不是javascript对象
    这篇文章主要介绍了dom对象是不是javascript对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇dom对象是不是javascript对象文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • JavaScript之Style对象与CurrentStyle对象
    在JavaScript中,可以通过Style对象和CurrentStyle对象来获取和设置HTML元素的样式属性。Style对象是D...
    99+
    2023-09-14
    Java
  • JavaScript对象、对象属性、对象方法的示例分析
    这篇文章主要介绍JavaScript对象、对象属性、对象方法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript 变量是数据值的容器。 这段代码把一个单一值...
    99+
    2024-04-02
  • Java并发编程之对象的共享
    目录1.可见性1.1 失效数据1.2 非原子的64位操作1.3 加锁和可见性1.4 volatile变量2. 发布与泄露3. 线程封闭3.1 Ad-hoc线程封闭3.2 栈封闭3.3...
    99+
    2024-04-02
  • Java并发编程之对象的组合
    目录1. 设计线程安全的类1.1 收集同步需求1.2 依赖状态的操作1.3 状态的所有权2. 实例封闭2.1 Java监视器模式3. 线程安全性的委托3.1 基于委托的车辆追踪器3....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作