热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

亚像素的一种实现方案及开闭操作实现高精度canny边缘检测

亚像素处理图像处理过程中,提高检测方法的精度一般有两种方式:一种是提高图像系统的光学放大倍数和CCD相机的分辨率能力;另一种是引入亚像素细分技术来弥补
  • 亚像素处理

图像处理过程中,提高检测方法的精度一般有两种方式:一种是提高图像系统的光学放大倍数和CCD相机的分辨率能力;另一种是引入亚像素细分技术来弥补硬件的不足以提高图像系统的分辨率。

如使用亚像素细分技术将精度提到到0.01像素,就相当于提高了100倍的图像系统分辨率。

但本文章并没有用插值方法进行操作,对像素之间进行划分,而是采取了numpy包中的resize函数,实现对图像像素点的放大,之后再进行相应的处理,最后的数据处于相应的倍数,以此来达到精度的要求。

scale_percent = 10
width = frame.shape[1] * scale_percent
height = frame.shape[0] * scale_percent
dim = (width, height)
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA) # 改变像素尺寸

scale_percent为放大倍数,这里设置了十倍的放大系数。


  • 开闭操作

开操作:是图像的轮廓变得光滑,断开的较窄的狭颈和消除细的突出物,使结构元B对集合A进行开操作,定义为:

A○B=(A⊖B)⊕B

含义:先用B对A进行腐蚀,然后用B对结果进行膨胀。 

闭操作:同样使图像轮廓变得光滑,但与开操作相反,他能弥合狭窄的间断和细小的沟壑,消除小的空洞,并填补轮廓线中的裂痕,使用结构元B对集合A进行闭操作,定义为:

A∙B=(A⊕B)⊖B

具体可参考这篇博客:图像处理开闭操作(17) - 柳帅 - 博客园

代码实现

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 图像二值化ret, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
# 开操作
frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel, iterations=5)
# 闭操作
frame = cv2.morphologyEx(frame, cv2.MORPH_CLOSE, kernel, iterations=5)

开操作可实现白色块变多,闭操作可实现黑色块变多。


高斯滤波

具体可参考这篇博客:图像平滑去噪之高斯滤波器 - KenSporger - 博客园

全部代码:

# !/usr/bin/env python
# _*_ coding: utf-8 _*_import cv2def main():frame = cv2.imread('Pic1_3.bmp')# print(frame.shape)frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 图像二值化ret, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)'''开闭操作'''kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))# 开操作frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel, iterations=5)# 闭操作frame = cv2.morphologyEx(frame, cv2.MORPH_CLOSE, kernel, iterations=1)cv2.namedWindow('cvtColor', cv2.WINDOW_NORMAL)cv2.resizeWindow('cvtColor', 800, 600)cv2.imshow('cvtColor', frame)'''改变尺寸'''scale_percent = 10width = frame.shape[1] * scale_percentheight = frame.shape[0] * scale_percentdim = (width, height)frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA) # 改变像素尺寸frame = cv2.GaussianBlur(frame, (17, 17), 0) # 图像去噪edge_output = cv2.Canny(frame, 50, 150) # 获取轮廓x = []y = []contours, heriachy = cv2.findContours(edge_output, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # contours将所有轮廓值放进一个列表内'''获取边缘点数据'''for contour in contours:for i in contour:x_s = i[0][0] / 10# print(x_s)y_s = i[0][1] / 10x.append(x_s)y.append(y_s)cv2.namedWindow('input image', cv2.WINDOW_NORMAL)cv2.resizeWindow('input image', 800, 600)cv2.imshow('input image', edge_output)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()

开闭操作后:

十倍放大的边缘图:

 

 虽然点看起来很稀疏,但是除于十后还是和密的。

如果大佬有更好的方案可以一起交流一下。


推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
author-avatar
谷智精源
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有