首页 文章 精选 留言 我的

精选列表

搜索[搜索增强],共10005篇文章
优秀的个人博客,低调大师

使用OpenCV实现图像增强

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 本期将介绍如何通过图像处理从低分辨率/模糊/低对比度的图像中提取有用信息。 下面让我们一起来探究这个过程: 首先我们获取了一个LPG气瓶图像,该图像取自在传送带上运行的仓库。我们的目标是找出LPG气瓶的批号,以便更新已检测的LPG气瓶数量。 步骤1:导入必要的库 import cv2import numpy as npimport matplotlib.pyplot as plt 步骤2:加载图像并显示示例图像。 img= cv2.imread('cylinder1.png')img1=cv2.imread('cylinder.png')images=np.concatenate(img(img,img1),axis=1)cv2.imshow("Images",images)cv2.waitKey(0)cv2.destroyAllWindows() LPG气瓶图片(a)批次-D26(b)批次C27 该图像的对比度非常差。我们几乎看不到批号。这是在灯光条件不足的仓库中的常见问题。接下来我们将讨论对比度受限的自适应直方图均衡化,并尝试对数据集使用不同的算法进行实验。 步骤3:将图像转换为灰度图像 gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray_img1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) 步骤4:找到灰度图像的直方图后,寻找强度的分布。 hist=cv2.calcHist(gray_img,[0],None,[256],[0,256])hist1=cv2.calcHist(gray_img1,[0],None,[256],[0,256])plt.subplot(121)plt.title("Image1")plt.xlabel('bins')plt.ylabel("No of pixels")plt.plot(hist)plt.subplot(122)plt.title("Image2")plt.xlabel('bins')plt.ylabel("No of pixels")plt.plot(hist1)plt.show() 步骤5:现在,使用cv2.equalizeHist()函数来均衡给定灰度图像的对比度。cv2.equalizeHist()函数可标准化亮度并增加对比度。 gray_img_eqhist=cv2.equalizeHist(gray_img)gray_img1_eqhist=cv2.equalizeHist(gray_img1)hist=cv2.calcHist(gray_img_eqhist,[0],None,[256],[0,256])hist1=cv2.calcHist(gray_img1_eqhist,[0],None,[256],[0,256])plt.subplot(121)plt.plot(hist)plt.subplot(122)plt.plot(hist1)plt.show() 步骤6:显示灰度直方图均衡图像 eqhist_images=np.concatenate((gray_img_eqhist,gray_img1_eqhist),axis=1)cv2.imshow("Images",eqhist_images)cv2.waitKey(0)cv2.destroyAllWindows() 灰度直方图均衡 让我们进一步深入了解CLAHE 步骤7: 对比度有限的自适应直方图均衡 该算法可以用于改善图像的对比度。该算法通过创建图像的多个直方图来工作,并使用所有这些直方图重新分配图像的亮度。CLAHE可以应用于灰度图像和彩色图像。有2个参数需要调整。 1. 限幅设置了对比度限制的阈值。默认值为40 2. tileGridsize设置行和列中标题的数量。在应用CLAHE时,为了执行计算,图像被分为称为图块(8 * 8)的小块。 clahe=cv2.createCLAHE(clipLimit=40)gray_img_clahe=clahe.apply(gray_img_eqhist)gray_img1_clahe=clahe.apply(gray_img1_eqhist)images=np.concatenate((gray_img_clahe,gray_img1_clahe),axis=1)cv2.imshow("Images",images)cv2.waitKey(0)cv2.destroyAllWindows() 步骤8: 门槛技术 阈值处理是一种将图像划分为前景和背景的简单但有效的方法。如果像素强度小于某个预定义常数(阈值),则最简单的阈值化方法将源图像中的每个像素替换为黑色像素;如果像素强度大于阈值,则使用白色像素替换源像素。阈值的不同类型是: cv2.THRESH_BINARY cv2.THRESH_BINARY_INV cv2.THRESH_TRUNC cv2.THRESH_TOZERO cv2.THRESH_TOZERO_INV cv2.THRESH_OTSU cv2.THRESH_TRIANGLE 尝试更改阈值和max_val以获得不同的结果。 th=80max_val=255ret, o1 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_BINARY)cv2.putText(o1,"Thresh_Binary",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)ret, o2 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_BINARY_INV)cv2.putText(o2,"Thresh_Binary_inv",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)ret, o3 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_TOZERO)cv2.putText(o3,"Thresh_Tozero",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)ret, o4 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_TOZERO_INV)cv2.putText(o4,"Thresh_Tozero_inv",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)ret, o5 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_TRUNC)cv2.putText(o5,"Thresh_trunc",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)ret ,o6= cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_OTSU)cv2.putText(o6,"Thresh_OSTU",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)final=np.concatenate((o1,o2,o3),axis=1)final1=np.concatenate((o4,o5,o6),axis=1)cv2.imwrite("Image1.jpg",final)cv2.imwrite("Image2.jpg",final1) Thresh_Binary_inv,Thresh_Binary_inv,Thresh_Tozero Thresh_Tozero_inv,Thresh_trunc,Thresh_OSTU 步骤9:自适应阈值 在上一节中,我们使用了全局阈值来应用cv2.threshold()。如我们所见,由于图像不同区域的照明条件不同,因此获得的结果不是很好。在这些情况下,您可以尝试自适应阈值化。在OpenCV中,自适应阈值处理由cv2.adapativeThreshold()函数执行 此功能将自适应阈值应用于src阵列(8位单通道图像)。maxValue参数设置dst图像中满足条件的像素的值。adaptiveMethod参数设置要使用的自适应阈值算法。 cv2.ADAPTIVE_THRESH_MEAN_C:将T(x,y)阈值计算为(x,y)的blockSize x blockSize邻域的平均值减去C参数。cv2.ADAPTIVE_THRESH_GAUSSIAN_C:将T(x,y)阈值计算为(x,y)的blockSize x blockSize邻域的加权总和减去C参数。 blockSize参数设置用于计算像素阈值的邻域的大小,它可以取值3、5、7等。 C参数只是从均值或加权均值中减去的常数(取决于adaptiveMethod参数设置的自适应方法)。通常,此值为正,但可以为零或负。 gray_image = cv2.imread('cylinder1.png',0)gray_image1 = cv2.imread('cylinder.png',0)thresh1 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)thresh2 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 31, 3)thresh3 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 13, 5)thresh4 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 4)thresh11 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)thresh21 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 31, 5)thresh31 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21,5 )thresh41 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 5)final=np.concatenate((thresh1,thresh2,thresh3,thresh4),axis=1)final1=np.concatenate((thresh11,thresh21,thresh31,thresh41),axis=1)cv2.imwrite('rect.jpg',final)cv2.imwrite('rect1.jpg',final1) 自适应阈值 自适应阈值 步骤10:OTSU二值化 Otsu的二值化算法,在处理双峰图像时是一种很好的方法。双峰图像可以通过其包含两个峰的直方图来表征。Otsu的算法通过最大化两类像素之间的方差来自动计算将两个峰分开的最佳阈值。等效地,最佳阈值使组内差异最小化。Otsu的二值化算法是一种统计方法,因为它依赖于从直方图得出的统计信息(例如,均值,方差或熵) gray_image = cv2.imread('cylinder1.png',0)gray_image1 = cv2.imread('cylinder.png',0)ret,thresh1 = cv2.threshold(gray_image,0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)ret,thresh2 = cv2.threshold(gray_image1,0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imwrite('rect.jpeg',np.concatenate((thresh1,thresh2),axis=1)) OTSU二值化 现在,我们已经从低对比度的图像中清楚地识别出批号。 交流群 欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三+上海交大+视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~ 本文分享自微信公众号 - 小白学视觉(NoobCV)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

ORM Bee V1.17.0.10 增强拦截器功能,增强 Android ORM 功能

ORM Bee简单易用,文件小,性能好;同时支持Android 和 Harmony,还支持 JDBC (可在 JavaWeb 等开发中使用)。 在Harmony 和 Android 两个环境, 可以用同一套 Bee 代码访问 DB, 提高代码重用,节省人力物。 Bee,互联网新时代的 Java ORM 工具,更快、更简单、更自动,开发速度快,运行快,更智能! V1.17.0.10 (查漏补缺) fixed bug: 1)拦截器对象不使用原型模式产生脏数据,改为原型模式 2)Android获取连接对象是已关闭的,要重新获取 -------------------------------------------------- Bee框架图 Bee是一个简单,易用,功能强大,开发速度快,编码少的 JAVA ORM 框架。连接,事务都可以由 Bee 框架负责管理.Bee 简化了与 DB 交互的编码工作量,是编码复杂度为O(1)的 Java 框架! Bee 简单易用:单表操作、多表关联操作,可以不用写 sql, 极少语句就可以完成 SQL 操作;概念简单,10 分钟即可入门。 Bee 功能强大:复杂查询也支持向对象方式,分页查询性能更高,一级缓存即可支持个性化优化;具有分布式特性。高级要求,还可以方便自定义 SQL 语句。 下期功能预告: 你还想添加什么功能,请到评论区告诉我们! 码云上的项目首页: https://gitee.com/automvc/bee https://gitee.com/automvc/bee-springboot github: https://github.com/automvc/bee

优秀的个人博客,低调大师

GNU Coreutils 9.1 发布,效率增强

GNU Coreutils 9.1 现已发布。GNU Core Utilities 是 GNU 操作系统的基本文件、shell 和文本操作实用程序,这些是预期存在于每个操作系统上的核心实用程序。。 GNU Coreutils 9.1 包含了广泛的修复、改进和其他改动。一个令人兴奋的方面是各种效率改进,如 cat 现在使用 copy_file_range 系统调用,对其他命令则使用更优化的 syscalls 以提高效率。 一些亮点更新内容如下: cat 命令现在使用 copy_file_range 系统调用,在常规文件之间进行简单的拷贝。反过来,在可能的复制卸载/重新链接中,这应该是更有效的。copy_file_range 系统调用用于从一个文件拷贝到另一个文件--在两个文件描述符之间拷贝一定范围的数据,而不需要通过用户空间。 cp、mv 和 install 命令在复制到一个目录时,现在使用类似 openat 的系统调用,这将避免一些 race conditions,并且更有效率。 ls 命令默认情况下不再给文件着色,因为它们很少被使用,而且每个文件的处理时间会增加约 30%。 ls 和 stat 命令默认不再尝试自动挂载文件,而是恢复到早期的行为。 如果遇到符号链接,使用 chmod -R 的递归 chmod'ing 将不再以错误状态退出。 修复了 macOS 上的 copy 行为,如果从苹果 APFS 文件系统复制到其他文件系统,可能导致误复制问题。还有其他的 macOS 修复,当源文件和目标文件是 APFS 上的普通文件时,copy 现在会创建一个 copy-on-write clone。 详情可查看:https://savannah.gnu.org/forum/forum.php?forum_id=10158

优秀的个人博客,低调大师

小诺官方文档再次增强

开源版本Java脚手架(快速开发平台)层出不穷,作为一块项目利器+私活利器,开发途中难免会遇到一些问题,这时大部分小伙伴也会想到说是去看官方文档。对于一块文档齐全的脚手架开发起来也是效率挺高,如果只是开源了没有文档或者是文档不齐全是件很头疼的事情。 现在让我们来说说小诺快速开发平台,一开始我们的第一个版本为vue版本的,前端选型采用AntDesignVue,不仅界面美观,还是Vue开发的,这对于喜欢Vue开发的小伙伴简直是福音。也有部分小伙伴问我们为什么没适配React,可能React这方面的使用的人还是少。 昨天(2021年1月18日),我们对整体的文档进行了大规模的改动,上面包含了Layui(单体版本)、Vue(前后分离)、Cloud(微服务前后分离)等周边文档的链接,更加的全面贴近用户使用习惯。 目前还有一些小伙伴从0开始跟我们学习,我们的文档将会在后面的版本中包含通过小诺0基础开发业务,大家期待吗? 想更多的了解我们,请关注我们官网:https://xiaonuo.vip,咱们Gitee代码中不见不散!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册