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

图像处理?没有Python可不行

python作为简单高效又很强大的一门编程语言,对于图像的处理自然也是轻松拿下,scikit-image是python中处理图像的一个库,

python作为简单高效又很强大的一门编程语言,对于图像的处理自然也是轻松拿下,scikit-image是python中处理图像的一个库,对大多数的图像处理算法进行了封装,用户只需调用相关的接口即可。

入门示例

首先使用pip安装skimage

pip install skimage

我们都知道,图像是由像素构成的,其中彩色图像还包括不同的通道,视频则是在图像的基础上加入时间变量而已。一张图就像是由像素点构成的表格一样,skimage正是基于此来进行图像的处理操作。具体来说,skimage使用numpy作为图像的数据类型,numpy不用多说,它可以让你在 Python 中使用向量和数学矩阵(有不了解的可以网上找找教程)。

我们首先来打开一张图片看看。

为了方便,我们使用skimage自带的一些图片,这些图片放在data模块下,使用data.导入即可。如果要打开本地文件夹下的图片,可以使用io模块下的imread方法,保存图片可以使用io.imsave。

from skimage import data, io
img = data.chelsea()
# 查看图片,使用io模块中的imshow方法
io.imshow(img)
# 保存图片
io.imsave('F:cat.jpg', img)

图片描述

接下来进行一些简单的图像处理。

一张图片在skimage中表示为多维数组的形式,比如img[2:16, 1:10, 0]表示宽度上从第2个像素点到第16个像素点,高度上从1到10的像素点,红色通道。如果为灰度图像则没有通道。也可以使用img[2, 3, 0]的形式,表示第二行,第三列,红色通道。

使用.shape显示图片的信息。如果图片为彩色图片,显示为宽度像素值,高度像素值,通道。

print(img.shape)

(300, 451, 3)

我们可以只显示图片的某一个通道,其中红绿蓝三个通道分别用数字0,1,2表示。比如只显示红色通道:

R = img[:, :, 0]
io.imshow(R)

图片描述

我们也可以通过只显示某部分像素区间来剪裁图像,比如:

img_c = img[80:180, 100:200, :]
io.imshow(img_c)

图片描述

还可以通过控制像素把图像二值化,也就是把像素值转换为0,1的形式。

from skimage import color
img4 = data.chelsea()
# 将彩色图像转为灰度图像,用到color模块
img_gray = color.rgb2gray(img4)# 拆包获得行列数
rows, cols = img_gray.shape# 循环,如果像素值小于0.5为0,反之则为1。
for i in range(rows):for j in range(cols):if img_gray[i, j]<&#61;0.5:img_gray[i, j] &#61; 0else:img_gray[i, j] &#61; 1
io.imshow(img_gray)

图片描述

图像增强

作为图像处理的一个部分&#xff0c;图像增强用来改善图像的图像的质量&#xff0c;也就是让图片更好看。skimage提供了强大的函数支持。

比如通过灰度变换改变图片的对比度和亮度。常见的算法有伽马调整和和log对数调整&#xff0c;在此不深究具体的算法细节&#xff0c;会用即可。

这里使用到matplotlib包&#xff0c;这是python中的一个绘图工具&#xff0c;用来展示图像&#xff0c;绘制统计图等。

from skimage import exposure, img_as_float
import matplotlib.pyplot as plt# 把图像的像素值转换为浮点数
imge5 &#61; img_as_float(data.moon())# 使用伽马调整
# 第二个参数控制亮度&#xff0c;大于1增强亮度&#xff0c;小于1降低。
gam1 &#61; exposure.adjust_gamma(imge5, 2)# 对数调整
log1 &#61; exposure.adjust_log(imge5, 0.7)# 用一行两列来展示图像
plt.subplot(1, 3, 1)
plt.imshow(imge5, plt.cm.gray)plt.subplot(1, 3, 2)
plt.imshow(gam1, plt.cm.gray)plt.subplot(1, 3, 3)
plt.imshow(log1, plt.cm.gray)

图片描述

另一个很有用的图像增强算法是直方图均衡化&#xff0c;能有效的改善图像。直方图均衡化简单来说就是通过将直方图变为均匀分布的来改善对比度。直方图的横坐标代表某个像素&#xff0c;纵坐标代表该像素有多少个。

# 直方图均衡化
import matplotlib.pyplot as pltimg6 &#61; data.moon()
# 指定绘制的大小
plt.figure("hist", figsize&#61;(8, 8))# 把图像的二维数组按行转为一维数组&#xff0c;这样才能绘制直方图
arr &#61; img6.flatten()plt.subplot(2,2,1)
plt.imshow(img6, plt.cm.gray)
plt.subplot(2,2,2)
# 绘制直方图
plt.hist(arr, bins&#61;256, normed&#61;1, edgecolor&#61;&#39;None&#39;,facecolor&#61;&#39;red&#39;)# 对直方图进行均衡化
img_c &#61; exposure.equalize_hist(img6)
arr_c &#61; img_c.flatten()
plt.subplot(2,2,3)
plt.imshow(img_c, plt.cm.gray)
plt.subplot(2,2,4)
plt.hist(arr_c, bins&#61;256, normed&#61;1, edgecolor&#61;&#39;None&#39;, facecolor&#61;&#39;red&#39;)plt.show()

图片描述

可以明显的看出&#xff0c;经过直方图均衡化之后&#xff0c;图像质量改善了许多。

再一个图像增强中常用的算法就是各种滤波器&#xff0c;像平滑化滤波器&#xff0c;锐化滤波器等。这其中&#xff0c;平滑滤波器可以用来去除噪声和平滑化处理图像&#xff0c;具体使用到的滤波器为低通滤波和中值滤波。不过低通噪声去除噪声的同时也平滑化了边和尖锐的细节&#xff0c;中值滤波则不会。

除了低通还有高通&#xff0c;除了中值还有最大值&#xff0c;最小值&#xff0c;均值等滤波器&#xff0c;在此不多赘述&#xff0c;查官方手册即可。

滤波器相关的算法放在filter模块下&#xff0c;记得导入。

from skimage import filters
import skimage.morphology as sm
image6 &#61; data.camera()
# 中值滤波
# 第二个参数代表滤波器的形状&#xff0c;disk代表平面圆形&#xff0c;当然还有什么正方形&#xff0c;矩形啥的
edges &#61; filters.median(image6, sm.disk(5))plt.subplot(1, 2, 1)
plt.imshow(image6, plt.cm.gray)plt.subplot(1, 2, 2)
plt.imshow(edges, plt.cm.gray)

图片描述

与平滑滤波器正好相反&#xff0c;锐化滤波器可以用来提取边缘&#xff0c;凸显某些标志&#xff0c;突出细节等。其中的算法包括各种算子&#xff0c;roberts算子&#xff0c;prewitt梯度算子等等&#xff0c;还有微分滤波器等。

比如使用sobel描述图像中物体的边缘。

img &#61; color.rgb2gray(data.chelsea())
# 使用sobel算子
edges &#61; filters.sobel(img)plt.figure("img", figsize&#61;(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.title("sobel")
plt.imshow(edges, plt.cm.gray)
plt.show()

图片描述

图像分割

图像分割主要就是进行特征提取&#xff0c;从而使别图像中的物体&#xff0c;比如给你一张满是苹果的照片&#xff0c;让你统计照片中一共有多少个苹果。数出来的可不算。这时候就要用到图像分割中的一些算法了。

介绍下阈值分割。阈值是什么意思&#xff0c;比如你有一堆苹果&#xff0c;为了区分出哪些是好苹果哪些是不好的&#xff0c;规定尺寸大于75的就是好的&#xff0c;这里的75就是阈值。简单来说&#xff0c;阈值分割就是利用图像中要提取的目标区域与其背景在灰度特性上的差异&#xff0c;把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合&#xff0c;选取一个比较合理的阈值&#xff0c;产生二值图像。

看个例子。

img &#61; color.rgb2gray(data.chelsea())
# 基于otsu阀值分割方法
thresh &#61; filters.threshold_otsu(img)
dst &#61; (img<&#61;thresh)*1.0plt.figure("img", figsize&#61;(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.title("otsu")
plt.imshow(dst, plt.cm.gray)
plt.show()

图片描述

再说下形态学变换&#xff0c;形态学变换包括膨胀处理&#xff0c;腐蚀处理&#xff0c;开闭运算&#xff0c;白黑帽等。膨胀处理的意思是说检测图像中像素值为1的点&#xff0c;然后将它周围某个区域的像素都变为1。膨胀处理可以扩充边缘和填充空洞。

看个例子。

img &#61; data.checkerboard()
# 设置结构元素为边长5的正方形
dst &#61; sm.dilation(img, sm.square(5))
plt.figure(&#39;dilation&#39;, figsize&#61;(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.imshow(dst, plt.cm.gray)

图片描述

腐蚀处理正好相反&#xff0c;检测图像中像素值为0的点&#xff0c;然后将它周围某个区域的像素都变为0。

img &#61; data.checkerboard()
# 设置结构元素为边长5的正方形
dst &#61; sm.erosion(img, sm.square(5))
plt.figure(&#39;dilation&#39;, figsize&#61;(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.imshow(dst, plt.cm.gray)

图片描述

图像识别

在机器学习和深度学习的推动下&#xff0c;图像识别获得了很大的发展&#xff0c;识别率节节攀升。如今的图像识别都在用深度学习算法来进行&#xff0c;所以这部分就不细讲了。

skimage中有一些很有用的算法用来检测轮廓。比如使用霍夫圆来检测圆形&#xff0c;椭圆变换来检测椭圆等等。

import numpy as np
import matplotlib.pyplot as plt
from skimage import data, color,draw,transform,feature,utilimage &#61; util.img_as_ubyte(data.coins()[0:95, 70:370]) #裁剪原图片
edges &#61;feature.canny(image, sigma&#61;3, low_threshold&#61;10, high_threshold&#61;50) #检测canny边缘fig, (ax0,ax1) &#61; plt.subplots(1,2, figsize&#61;(8, 5))ax0.imshow(edges, cmap&#61;plt.cm.gray) #显示canny边缘
ax0.set_title(&#39;original iamge&#39;)hough_radii &#61; np.arange(15, 30, 2) #半径范围
hough_res &#61;transform.hough_circle(edges, hough_radii) #圆变换 centers &#61; [] #保存中心点坐标
accums &#61; [] #累积值
radii &#61; [] #半径for radius, h in zip(hough_radii, hough_res):#每一个半径值&#xff0c;取出其中两个圆num_peaks &#61; 2peaks &#61;feature.peak_local_max(h, num_peaks&#61;num_peaks) #取出峰值centers.extend(peaks)accums.extend(h[peaks[:, 0], peaks[:, 1]])radii.extend([radius] * num_peaks)#画出最接近的5个圆
image &#61; color.gray2rgb(image)
for idx in np.argsort(accums)[::-1][:5]:center_x, center_y &#61; centers[idx]radius &#61; radii[idx]cx, cy &#61;draw.circle_perimeter(center_y, center_x, radius)image[cy, cx] &#61; (255,0,0)ax1.imshow(image)
ax1.set_title(&#39;detected image&#39;)

图片描述

这篇文章大致介绍了使用skimage库来进行图像处理的一些过程&#xff0c;各种算法的具体使用还是查看官方手册最为妥当。

本人才疏学浅&#xff0c;上文中难免有些错误&#xff0c;还请各位品评指正。



推荐阅读
  • 每日一书丨AI圣经《深度学习》作者斩获2018年图灵奖
    2019年3月27日——ACM宣布,深度学习之父YoshuaBengio,YannLeCun,以及GeoffreyHinton获得了2018年的图灵奖, ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 视觉图像的生成机制与英文术语解析
    近期,Google Brain、牛津大学和清华大学等多家研究机构相继发布了关于多层感知机(MLP)在视觉图像分类中的应用成果。这些研究深入探讨了MLP在视觉任务中的工作机制,并解析了相关技术术语,为理解视觉图像生成提供了新的视角和方法。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
author-avatar
桃花岛的小米_992
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有