图像分割 - 孤立点的检测

2023/9/30 16:59:44

目录

1. 介绍

2. 代码实现


1. 介绍

因为,一阶导数通常会产生粗边缘。二阶导数对精细细节(细线、孤立点、噪声)有更强的响应。

所以,检测孤立点应该以二阶导数为基础,而二阶导数的差分计算为:

\bigtriangledown ^{2}f(x,y) = f(x+1,y) + f(x-1,y) + f(x,y+1) + f(x,y-1) - 4f(x,y)

这个差分计算可以通过一个 系数和为零 的kernel去完成

于是,如果滤波器的响应超过一个规定的阈值,那我们就认为在kernel的中心找到了一个点。将找到的点记作1,其他的点看作0,于是就得到了一副二值图像

直观上看,这个概念是孤立点的灰度完全不同于其周围像素的灰度

孤立点是那些灰度差超过某个阈值T,被认为是孤立点的像素点

为了更好的探测8邻域的灰度差值,将滤波器的权重换成下面类型的:

111
1-81
111

2. 代码实现

代码为:

import numpy as np
import cv2


def point_detect(img):

    canvas = np.zeros(img.shape, dtype=np.uint8)       # 拷贝图像
    kernel = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])   # 定义卷积核
    laplacian = cv2.filter2D(img, cv2.CV_16S, kernel)       # 拉普拉斯变换

    img_lap = cv2.convertScaleAbs(laplacian)        # 拉普拉斯图像
    cv2.imshow('laplacian',img_lap)
    
    T = 0.9 * np.abs(laplacian).max()           # 阈值 T

    for i in range(img.shape[0]):           # 遍历图像,寻找孤立点
        for j in range(img.shape[1]):
            if (laplacian[i, j] > T) or (laplacian[i, j] < -T):     # 绝对值大于阈值的点
                canvas[i, j] = 255  # 二值处理
                cv2.circle(canvas, (j, i), 10, 255)     #   绘制圆

    return canvas


img = cv2.imread('img.tif',0)
ret = point_detect(img)
cv2.imshow('img',np.hstack((img,ret)))
cv2.waitKey()
cv2.destroyAllWindows()

处理的结果为:

原图、检测孤立点的二值图像

原图的拉普拉斯图像为:

 


 这里对孤立点检测函数的代码做简单讲解:

1. 首先,建立一个全零的图片canvas,后面将检测的孤立点改为255,这样canvas就是二值图像了

2. filter2D 里面的ddepth 是CV_16S ,因为做差会出现负数,不能采用无符号的形式

 3. 如果为了打印拉普拉斯图像,需要将图像转换成uint8,并且灰度值在0-255之间。这里用的是convertScaleAbs函数,就是取绝对值,然后超过255的都取255。

如果采用norm的形式是这个样子的,代码为:

img_norm = cv2.normalize(laplacian,None,0,255,norm_type=cv2.NORM_MINMAX,dtype=cv2.CV_8U)

4. 这里不管用convert还是norm的形式都要取对应的阈值T,最后就是遍历图像,将大于T的找出来,赋值为255就行了。为了方便观察,以孤立点绘制出一个圆弧,注:圆心的坐标是反过来的


http://www.jnnr.cn/a/108139.html

相关文章

3GPP R17空闲态功耗特性

Paging Early Indication 为了进一步降低空闲态UE监听PDCCH的功耗&#xff0c;R17提出Paging Early Indication(PEI)方案。方案的主要思想是在PO(Paging Occasion)之前插入一个PEI-O(PEI Occasion)&#xff0c;UE在解调到PEI信息之后&#xff0c;再确定是否需要解调PO信息。其中…

太狠了,阿里员工手写的Spring核心面试笔记:IOC+AOP+MVC+事务

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

微信开放平台应用签名MD5

可以使用JS转换一下 一、在任一网页 右键 检查 打开调试 二、把字母转换成小写&#xff0c;去除&#xff08;:&#xff09; MD5 应用签名示例 "70:71:5F:CA:AE:E5:B1:01:30:11:8F".toLowerCase().replace(/:/g, "") 70715fcaaee5b10130118f 就是要填写…

浪漫3D樱花漫天飞舞特效【附源码】

免费领取源码参考 【浪漫3D樱花漫天飞舞特效】 博主介绍&#xff1a; &#x1f680;自媒体 JavaPub 独立维护人&#xff0c;全网粉丝15w&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;51cto TOP10博主&#xff0c;知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专…

作为资深Mac用户,有哪些你相见恨晚的软件值得推荐?

程序员宝藏库&#xff1a;https://github.com/Jackpopc/CS-Books-Store 用macOS好多年了&#xff0c;除了我们经常接触的软件&#xff0c;其实有很多名气不大&#xff0c;但是却非常好用&#xff0c;能够大大提升效率的软件。 今天&#xff0c;就来给大家推荐20款&#xff0c;…

Mybatis补充知识

一.对于orm框架的了解 了解orm,先了解以下概念&#xff1a; 1.1什么是“持久化” 持久&#xff08;Persistence&#xff09;&#xff0c;即把数据&#xff08;如内存中的对象&#xff09;保存到可永久保存的存储设备中&#xff08;如磁盘&#xff09;。持久化的主要应用是将内…

【云原生】Redis on k8s 编排部署讲解与实战操作

文章目录一、概述二、redis 主从模式编排部署实战操作1&#xff09;下载chart 包2&#xff09;构建镜像3&#xff09;修改yaml编排4&#xff09;开始部署5&#xff09;测试验证6&#xff09;卸载三、redis 哨兵模式编排部署实战操作1&#xff09;构建镜像2&#xff09;修改yaml…

集合(Set)和有序集合(ZSet)的基本使用方法详解【Redis】

文章目录一. Redis中的集合(Set)1.1基本的一些操作1.1.1 smembers查看集合中的所有成员1.1.2 scard删除成员数量1.1.3 smove移动成员1.1.4 sinterstore 存储俩个集合的交集二.Redis中的有序集合(ZSet)2.1 基本的一些操作2.1.1 zadd添加1到多个成员2.1.2 zcount 返回指定分数区间…

基于Python+Nodejs+MONGODB的电影推荐网站

2 用途 2.1功能 本软件是面向小型电影数据分析电影爱好者&#xff0c;及推荐电影所做成的。主要包括&#xff1a;数据爬取、数据维护、电影信息展示、电影推荐等模块。 数据爬取业务模块主要包括从猫眼电影数据进行爬取&#xff0c;并且将其存入数据库中。该业务获取的基础数据…

CAN 协议学习笔记

CAN 协议学习笔记 物理层&#xff1a; can 的物理电路连接 无主机从机之分表达信号需要差分信号&#xff08;2条线表示差分&#xff09;半双工 一个时间表示一个信号 &#xff0c;抗干扰能力强。CanHigh CanLow同时变化&#xff0c;对差分信号无影响。以Can高速为例&#xf…

手把手教你用Nodejs 实现一个简单的 Redis客户端

0. 写在前面# 大家如果有去看过nodejs所支持的官方库的话&#xff0c;应该会惊讶于它所提供了非常完善的网络库&#xff0c;不仅是应用层&#xff0c;传输层&#xff0c;等等基础的协议&#xff0c;我们可以按照事件驱动的逻辑编写清晰易懂的网络应用&#xff0c;网络服务。这也…

【C++初阶6-模版初阶】“多个愿望一次满足~”

前言 学习C的第一篇博客&#xff0c;我们就谈到了“函数重载”。现在回头看&#xff0c;它的存在对C其他语法是至关重要&#xff0c;如运算符重载Swap类似的函数等——帮助我们减少不必要的代码&#xff0c;提高可读性&#xff0c;是很实用的设计。而今天要讲的模版&#xff0…

pygame2 画点线

一、复习&#xff1a; 首先将上次画的矩形做复杂一些的小程序&#xff1a; import pygame,sys, randompygame.init() screen pygame.display.set_mode([640, 480]) screen.fill([255, 255, 255])for i in range(100):width random.randint(0, 250)height random.randint(0…

SpringMVC框架之Controller方法的返回值

其实选错了就选错了&#xff0c;人不可能每一步都正确的&#xff0c;很多事就算能重来一遍&#xff0c;以当时的心智和阅历&#xff0c;还是会做同样的选择&#xff0c;避免不了同样的结果&#xff0c;所以&#xff0c;不用去回头看&#xff0c;也不必批判当时的自己。 首先先…

.net第七章------类成员

文章目录前言类成员的基本组成静态成员和实例成员静态成员(static)实例成员例子this关键字访问修饰符字段和常量字段的声明和访问静态字段和实例字段常量字段只读与可变字段只读字段可变字段方法基于表达式声明方法&#xff08;C# 6.0&#xff09;【例7.10】基于表达式的声明方…

【java服务框架】分布式缓存_01、Redis持久化 主从同步 搭建哨兵集群

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 0.学习目标 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff…

浅谈java中的String

Java中的String类型不属于八大基本数据类型&#xff0c;而是一个引用数据类型&#xff0c;所以在定义一个String对象的时候如果不直接赋值给这个对象&#xff0c;它的默认值就是null。我们要怎么理解String类型的不可变&#xff0c;在JDK源码中String这个类的value方法被final关…

手把手教你正确地创建一个Servlet项目

文章目录常见问题创建 Servlet 项目的完整流程1. 创建一个 Maven 项目2. 完善项目的路径3. 修改配置文件4. 配置 Maven 国内源5. 重新下载 jar 包6. 编写简单代码7. 运行Tomcat说在后面常见问题 问题一: 我代码明明跟别人的是一样的, 为什么一直会出现红色感叹号?问题二: 为什…

计算机毕业设计(附源码)python智慧灭火器管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

微信小程序(四)--- 自定义组件详解(properties,数据监听器,纯数据字段,插槽,父子间通信,behaviors)

目录 一、创建组件 二、引用组件 1、局部引用 2、全局引用 三、组件和页面的区别 四、组件样式隔离 1、注意点 2、修改组件的样式隔离选项 五、数据、方法、属性 1、data数据 2、methods方法 3、properties属性 4、data和properties的区别 5、使用setData修改proper…
最新文章