使用Numpy和Opencv完成图像的基本数据分析(Part III)

引言

本文是使用python进行图像基本处理系列的第三部分,在本人之前的文章里介绍了一些非常基本的图像分析操作,见文章《使用Numpy和Opencv完成图像的基本数据分析Part I》和《使用Numpy和Opencv完成图像的基本数据分析 Part II》,下面我们将继续介绍一些有关图像处理的好玩内容。

本文介绍的内容基本反映了我本人学习的图像处理课程中的内容,并不会加入任何工程项目中的图像处理内容,本文目的是尝试实现一些基本图像处理技术的基础知识,出于这个原因,本文继续使用 SciKit-Image,numpy数据包执行大多数的操作,此外,还会时不时的使用其他类型的工具库,比如图像处理中常用的OpenCV等:

本系列分为三个部分,分别为part I、part II以及part III。刚开始想把这个系列分成两个部分,但由于内容丰富且各种处理操作获得的结果是令人着迷,因此不得不把它分成三个部分。系列所有的源代码地址:GitHub-Image-Processing-Python。

在上一篇文章中,我们已经完成了以下一些基本操作。为了跟上今天的内容,回顾一下之前的基本操作:

  • 导入图像并观察其属性
  • 拆分图层
  • 灰度处理
  • 对像素值使用逻辑运算符
  • 使用逻辑运算符进行掩码

现在开始本节的内容:

强度变换|Intensity Transformation

首先导入一张图像作为开始:

%matplotlibinlineimport imageio
import matplotlib.pyplot as plt
import warnings
import matplotlib.cbook
warnings.filterwarnings("ignore",category=matplotlib.cbook.mplDeprecation)pic=imageio.imread('img/parrot.jpg')plt.figure(figsize=(6,6))
plt.imshow(pic);
plt.axis('off');

 

图像底片|Image Negative

强度变换函数在数学上定义为:

S = T(r)

其中r是输入图像的像素,S是输出图像的像素,T是一个转换函数,它将r的每个像素值映射到s中对应的像素值。
负变换,即恒等变换的逆。在负变换中,输入图像的每个像素值从L-1中减去并映射到输出图像上。
在这种情况下,完成以下转换:

S =(L-1)-r

因此,每个像素值都减去255。这样的操作导致的结果是,较亮的像素变暗,较暗的图像变亮,类似于图像底片。

negative =255- pic # neg = (L-1) - imgplt.figure(figsize= (6,6))
plt.imshow(negative);
plt.axis('off');

 

对数变换|Log transformation

对数转换可以通过以下公式定义:

s = c *log(r + 1)

其中s和r是输出和输入图像的像素值,c是常数。输入图像的每个像素值都会加1,之后再进行对数操作,这是因为如果图像中的像素值为0时,log(0)的结果等于无穷大。因此,为了避免这种情况的发生,输入图像中的每个像素值都加1,使最小像素值至少为1。

在对数变换过程中,与较高像素值相比,图像中的低像素被扩展。较高的像素值在对数变换中被压缩,这导致图像增强。

对数变换中的c值调整了我们想要的增强程度:

%matplotlibinlineimport imageio
import numpyasnp
import matplotlib.pyplotaspltpic=imageio.imread('img/parrot.jpg')
gray=lambdargb:np.dot(rgb[...,:3],[0.299,0.587,0.114])
gray=gray(pic)'''
log transform
-> s = c*log(1+r)So, we calculate constant c to estimate s
-> c = (L-1)/log(1+|I_max|)'''max_=np.max(gray)def log_transform():
return(255/np.log(1+max_))*np.log(1+gray)plt.figure(figsize=(5,5))
plt.imshow(log_transform(),cmap=plt.get_cmap(name='gray'))
plt.axis('off');

 

伽马校正| Gamma Correction

伽马校正,或通常简称为伽玛,是用于对视频或静止图像系统中的亮度或三刺激值进行编码和解码的非线性操作,伽玛校正也称为幂律变换。首先,图像的像素值大小范围必须从0~255被缩放至0~1.0。然后,通过应用以下等式获得伽马校正后的输出图像:

Vo = Vi ^(1 / G)

其中Vi是我们的输入图像,G是设置的伽玛值,然后将输出图像Vo缩放回0-255范围。

对于伽马值而言,G <1有时被称为编码伽玛,并且利用该压缩幂律非线性进行编码的过程被称为伽马压缩; Gamma值小于1会将图像移向光谱的较暗端。

相反,伽马值G> 1被称为解码伽马,并且膨胀幂律非线性的应用被称为伽马展开。Gamma值大于1将使图像显得更亮。将伽玛值设置为G = 1时对输入图像没有影响:

import imageio
import matplotlib.pyplotasplt# Gamma encoding 
pic=image io.imread('img/parrot.jpg')
gamma=2.2# Gamma < 1 ~ Dark ; Gamma > 1 ~ Brightgamma_correction=((pic/255)**(1/gamma))
plt.figure(figsize=(5,5))
plt.imshow(gamma_correction)
plt.axis('off');

 

伽马校正的原因|Reason for Gamma Correction

我们应用伽马校正的原因是,由于我们的眼睛感知颜色和亮度这一过程与数码相机中的传感器的工作原理不同。当数码相机上的传感器获得两倍的光子量时,信号会加倍。但是,我们人类的眼睛的工作原理与这不同,当我们的眼睛感知两倍的光量时,视野中只有一小部分显得更亮。

因此,数码相机在亮度之间具有线性关系,而我们人类的眼睛具有非线性关系。为了解释这种关系,我们应用伽玛校正。

还有一些其他的线性变换函数,比如:

  • 对比度拉伸(Contrast Stretching)
  • 强度切片(Intensity-Level Slicing)
  • 位平面切片(Bit-Plane Slicing)

卷积|Convolution

在上一篇文章中,对卷积操作作了简要讨论。当计算机看到图像时,它看到不是一整幅图像,它的眼里看到的只是一个像素值数组。假设读取一个32X32大小的彩色图像,根据图像的分辨率和大小,计算机它将看到一个32 x 32 x 3维的数字数组,其中3表示RGB值或三通道。

假设现在我们有一个PNG格式的彩色图像,它的大小是480 x 480。将其读入后,其表示数组将是480 x 480 x 3维。数组中的所有的每个数字值范围都在0到255之间,它描述的是那个点的像素强度。

就像我们刚才提到的那样,假设输入图像是一个32 x 32 x 3的像素值数组,解释卷积的最佳方法是想象一个闪烁在图像左上方的手电筒。假设手电筒照射区域大小为3 x 3。

现在,让我们假设这个手电筒滑过输入图像的所有区域。在机器学习术语中,这个手电筒被称为过滤器(filter)或内核(kernel),或者有时被称为权重(weights) 或  掩模(mask),它所照射的区域称为 感受野(receptive field)。

现在,此过滤器也是一个数字数组,数组中的数字称为权重或参数,在这里要着重注意一点,此过滤器的深度必须与输入图像的深度相同,即通道数相同,因此此过滤器的尺寸为3 x 3 x 3。

图像内核 或过滤器是一个小矩阵,用于应用我们可能在Photoshop或Gimp中找到的效果,例如模糊、锐化、轮廓或浮雕等。此外,它们还被用于在机器学习中进行图像特征提取(CNN),这是一种用于确定图像最重要部分的技术。更多相关信息,请查看Gimp关于使用Image kernel的文档,我们可以该文档中找到最常见的内核列表  。

现在,让我们将过滤器放在图像的左上角。当滤波器围绕输入图像滑动或卷积时,它将滤波器中的值乘以图像的原始像素值(也称为计算元素乘法)。这些乘法操作最后都会求和,所以卷积操作后只得到一个数字值。请记住,此数字仅代表过滤器位于图像的左上角。

现在,我们对输入图像上的每个位置重复此过程,移动过滤器使其与图像矩阵的每个像素值进行卷积操作,这个过程需要设置移动步幅,依此类推,完成整幅图像的卷积操作。输入图中的每个唯一位置都会生成一个数字。步幅的取值一般为1,也可以取其它大小的值,但我们关心的是它是否适合输入图像。


过滤器滑过输入图像上的所有位置后,我们会发现,我们剩下的是一个30 x 30 x 1的数组,我们将其称为激活图 或特征图。将3 x 3过滤器可以放在32 x 32输入图像上,可以得到30 x 30大小的阵列,原因是有300个不同的位置,这900个数字映射到30 x 30阵列。我们可以通过以下方式计算卷积图像后图像的大小:

  • 卷积:(N-F)/ S + 1

其中N和F分别代表输入图像大小和卷积核大小,S代表步幅或步长。因此,对于上述情况,输出图像的大小将是

  • 32-31 + 1 = 30

假设我们有一个3x3滤波器,在5x5大小的矩阵上进行卷积,根据等式,我们应该得到一个3x3矩阵,现在让我们看一下:

 


此外,我们实际上使用的过滤器不止一个,过滤器的数量自己设定,假设过滤器的数量设置为n,则我们的输出将是28x28xn大小(其中n是特征图的数量  )。

通过使用更多的过滤器,我们能够更好地保留空间维度信息。

然而,对于图像矩阵边界上的像素,卷积核的一些元素移动时会出现在图像矩阵之外,因此不具有来自图像矩阵的任何对应元素。在这种情况下,我们可以消除这些位置的卷积运算,最终输出矩阵大小将会小于输入图像,或者我们可以对输入图像矩阵进行填充(padding),以保证输出图像大小维度不变。

为了保持本系列的简洁而保持内容的完整性,本文提供了全部的资源链接,在其中更详细地解释了有关内容。

下面,让我们首先将一些自定义卷积核个数的窗口应用于图像中,这可以通过平均每个像素值与附近的像素值来处理图像:

%%time
import numpy as np
import imageio
import matplotlib.pyplot as plt
from scipy.signal import convolve2ddef Convolution(image, kernel):
conv_bucket= []
for d in range(image.ndim):
conv_channel= convolve2d(image[:,:,d], kernel, mode="same", boundary="symm")
conv_bucket.append(conv_channel)
returnnp.stack(conv_bucket, axis=2).astype("uint8")kernel_sizes= [9,15,30,60]
fig, axs=plt.subplots(nrows=1, ncols=len(kernel_sizes), figsize=(15,15));pic =imageio.imread('img:/parrot.jpg')for k, ax in zip(kernel_sizes, axs):kernel =np.ones((k,k))kernel /=np.sum(kernel)
ax.imshow(Convolution(pic, kernel));
ax.set_title("Convolved By Kernel: {}".format(k));
ax.set_axis_off();
Wall time: 43.5 s

 


更多内容可以在此查看,其中已经深入讨论了各种类型的内核,并展示了它们之间的差异。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft Windows Server 2019 1809 iso镜像 企业版本

企业版本 标准版本 默认页面&#xff0c;关闭即可 参考链接&#xff1a; Microsoft Windows Server 2019 1809 iso镜像 http://www.ddooo.com/softdown/131736.htm

【程序猿必备】数据结构与算法精选面试题

有很多计算机科学技术专业的毕业生和程序员申请在Uber和Netflix这样的初创公司、谷歌和阿里巴巴这样的大公司以及Infosys或Luxsoft等以服务为基础的公司从事编程、编码和软件开发工作&#xff0c;但他们中的许多人都不知道&#xff0c;当你申请这些公司的职位时&#xff0c;你会…

技术干货 | 详谈AI芯片分类和关键技术

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 架构师技术联盟责编 | 阿秃人工智能芯片目前有两种发展路径&#xff1a;一种是延续传统计算架构&#xff0c;加速硬件计算能力&#xff0c;主要以 3 种类型的芯片为代表&#xff0c;即 GPU、 FPGA、 ASIC&#xff0c;但 CPU依…

AI+服务 阿里巴巴如何做智能服务转型?

AI下围棋、AI写作文、AI看病……在智能时代&#xff0c;通过新技术的赋能&#xff0c;行业已经发展到了一个新的高度。那么在服务领域&#xff0c;尤其是企业服务中&#xff0c;智能技术的加入会带来哪些新的想象&#xff1f; 在阿里巴巴&#xff0c;智能服务已经成为企业发展…

tfidf关键词提取_基于TextRank提取关键词、关键短语、摘要,文章排序

之前使用TFIDF做过行业关键词提取&#xff0c;TFIDF仅从词的统计信息出发&#xff0c;而没有充分考虑词之间的语义信息。TextRank考虑到了相邻词的语义关系&#xff0c;是一种基于图排序的关键词提取算法。TextRank的提出TextRank由Mihalcea与Tarau于EMNLP04提出来&#xff0c;…

AliOS Things手势识别应用演示

1. 概述 手势识别作为一种辅助的人机交互方式&#xff0c;在人机脱离的场景下可以提供方便的交互体验。本文介绍基于AliOS Things STM32F413H Discovery开发板实现手势交互功能的演示。 2. 环境搭建 开发板&#xff1a;STM32F413H Discovery&#xff08;附带麦克风阵列板&a…

idea 个性化定制快捷键

添加和修改快捷键 先找到相应的快捷键 鼠标右击&#xff0c;上面add开头是添加&#xff0c;下面remove是移除快捷键

i 智慧 | 回首30年存储演进之路 再看新数据时代阿里云存储如何革故鼎新?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹 责编 | 阿秃 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;人类以日新月异的速度刷新着科技的成果&#xff0c;其中存储的发展历史尤其悠久&#xff0c;堪称万年进化史。自文明诞生以来&#xff0…

php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证

namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;class AddCartRequest extends FormRequest{public function authorize(){return true;}//这两种写法都是支持的public function rules(){return [amount > [required, integer, min:1],pid > r…

AliOS Things声源定位应用演示

1. 概述 利用麦克风阵列进行声源定位在智能降噪、语音增强、语音识别等领域有广泛应用和研究前景。本文介绍基于AliOS Things STM32F413H Discovery开发板实现声源定位算法集成和功能演示。 声源定位算法 本案例集成了STMicroelectronics的Acoustic_SL声源定位算法。Acousti…

可优比和aag哪个好_火花塞多级和单级哪个性能更好?多就等于好?这可未必

从电极数量来判断火花塞性能&#xff0c;选择火花塞的一个误区&#xff01;不知从何时开始&#xff0c;很多车友选择火花塞特别迷信侧电极数量&#xff0c;认为侧电极数量越多&#xff0c;火花塞就越好&#xff0c;点火火花就越大。我估计这是被一些别有用心的人带节奏了&#…

Quick BI v3.0版本全新起航——2018杭州云栖大会

在9月22日杭州云栖大会云上数据中台专场中&#xff0c;阿里巴巴产品专家陌停跟现场的观众们分享了Quick BI v3.0版本的新体验、新分析和新功能。 作为一个高效数据分析与展现的BI套件&#xff0c;Quick BI通过拖拽式的可视化分析能力&#xff0c;让懂业务的人自助式实现数据分析…

IDEA配置JDK

IDEA配置JDK 项目应用JDK

漫画:我用深度学习框架画下女朋友最美的脸

这不&#xff0c;又一个程序员为爱变身灵魂画手&#xff0c;看得我都想学画画了。阿华是幸运的&#xff0c;因为他找到了对的方法&#xff0c;事半功倍&#xff0c;最终有情人终成眷属。这也得益于 PyTorch 的易学易用&#xff0c;大多数人第一次使用 PyTorch 几乎可以做到无痛…

云端一体化差分+安全升级,AliOS Things物联网升级“利器”

1.1 OTA升级简介 随着物联网的日益发展&#xff0c;OTA升级逐渐成为物联网设备的刚性需求&#xff0c;目前物联网设备种类繁多&#xff0c;但并未提供统一的OTA升级方案&#xff0c;针对日益发展的物联网设备&#xff0c;开发者迫切需要一套云端一体化的OTA升级方案来满足快速迭…

startlogging中设置setstdout=false来禁用这个功能。_Windows 10禁用USB选择性暂停设置,峰哥教你解决USB设备失灵问题...

最近发现在 Win10 笔记本中使用 U 盘或者连接一些 USB 外设的情况下&#xff0c;时不时会有设备失灵的现象。经过研究发现&#xff0c;微软为了节省电力&#xff0c;在 Win10 系统中内置了一项「USB 选择性暂停设置」&#xff0c;而这个功能默认还处于启用状态。启用「USB 选择…

数据库“新解”,看这里,get!

自从第一台通用计算机诞生至今&#xff0c;围绕计算机系统硬件的创新迭代就一直“在路上”&#xff0c;伴随着硬件能力的不断提升&#xff0c;软件更新自然不可缺少。通常来说在传统的计算机软件工程领域&#xff0c;操作系统、编译器与数据库被并称为最具难度的“三剑客”系统…

阿里云发布链路追踪服务Tracing Analysis

近日&#xff0c;在杭州云栖大会上&#xff0c;阿里云发布了链路追踪服务Tracing Analysis&#xff0c;成本是自建链路追踪系统的1/5或更少&#xff0c;可为分布式应用的开发者提供完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等工具&#xff0c;帮助开发者快速…

深入体验php项目开发.pdf,《深入体验PHP项目开发》.(谭贞军).[PDF]

090756q2fwgddoa5qto2kz.jpg (65.13 KB, 下载次数: 0)2018-8-8 14:24 上传本书介绍:php语言是当今使用最为频繁的网络编程语言之一&#xff0c;一直在开发web领域占据重要的地位。本书通过10个综合实例的实现过程&#xff0c;详细讲解了php语言在实践项目中的综合运用过程&…