第一章 基本的图像操作和处理

news2024/11/24 12:25:39

文章目录

  • 第一章 基本的图像操作和处理
    • 1.1PIL:Python图像处理类库
      • 1.1.1转图像格式
      • 1.1.2创建缩略图
      • 1.1.3复制和粘贴图像区域
    • 1.2Matplotlib
      • 1.2.1绘制图像、点、线
      • 1.2.2图像轮廓和直方图
    • 1.3NumPy
      • 1.3.1图像数组表示
      • 1.3.2灰度变换
      • 1.3.4直方图均衡化
    • 1.4SciPy
      • 1.4.1图像模糊
      • 1.4.2图像导数
      • 1.4.3形态学:对象计数

第一章 基本的图像操作和处理

1.1PIL:Python图像处理类库

from PIL import Image
from IPython.display import display

img = Image.open('jmu.jpg')
img2 = img.convert('L')
display(img)
display(img2)

在这里插入图片描述

在这里插入图片描述

这是个PIL的简单例子:读入图片、转灰度图、显示图片(这两张图片显然有点太大了)。

1.1.1转图像格式

Image.open('me.jpg').save('me.png')

将jpg转成png

1.1.2创建缩略图

显然前面的图片太大了,我们可以创建缩略图显得小一点

size=400
img.thumbnail((size,size))
display(img)

在这里插入图片描述

需要注意的是,这个函数只能缩小、不能放大,缩小后就回不去了。

1.1.3复制和粘贴图像区域

box = (0,200,300,400) # 切割的box位置
region = img.crop(box) 
region = region.transpose(Image.FLIP_TOP_BOTTOM) # 翻转180°
img.paste(region,box) # 覆盖原位置
display(img) 

在这里插入图片描述

这是个PIL的简单例子:读入图片、转灰度图、显示图片(这两张图片显然有点太大了)。

我把下半图的水中倒影翻转了一下,看起来和上半图差不多

1.2Matplotlib

1.2.1绘制图像、点、线

from PIL import Image
from pylab import *

img = Image.open('jmu.jpg')
img=img.resize((300,400))
imshow(img)
x = [134,134,240,240]
y = [54,330,0,400]
plot(x,y,'r*')
plot(x[:2],y[:2])
title('JMU')
show()

在这里插入图片描述

其中plot(x,y,‘r*’)表示红色星状标记

用PyLab库绘图的基本颜色格式命令

编码颜色
‘b’蓝色
‘g’绿色
‘r’红色
‘c’青色
‘m’品红
‘y’黄色
‘k’黑色
‘w’白色

用PyLab库绘图的基本线型格式命令

编码线型
‘-’实线
‘–’虚线
‘:’点线

用PyLab库绘图的基本绘制标记格式命令

编码标记
‘.’
‘o’圆圈
‘s’正方形
‘*’星形
‘+’加号
‘x’叉号

1.2.2图像轮廓和直方图

plt.figure()
plt.gray()
plt.contour(img2, origin='image')
plt.axis('equal')
plt.axis('off')

在这里插入图片描述

由于这张图包含东西太多,如建筑、行人、树、道路、云彩,所以这个轮廓有点乱。

hist(array(img2).flatten(),256)
show()

在这里插入图片描述

显示该图片的 直方图

1.3NumPy

1.3.1图像数组表示

img = array(Image.open('jmu.jpg'))
print (img.shape, img.dtype)
img2 = array(Image.open('jmu.jpg').convert('L'),'f')
print (img2.shape, img2.dtype)
(1707, 1280, 3) uint8
(1707, 1280) float32

1.3.2灰度变换

img = array(Image.open('jmu.jpg').convert('L'))
img2 = 255 - img # 对图像进行反相处理
img3 = (80.0 * img/255.0)  # 将图像像素值变换到 [0,80] 区间
img4 = 255.0 * (img/255.0)**2 # 对图像像素值求平方后得到的图像
titles=['img','255-img','[0,80]','img**2']
imgs=[img,img2,img3,img4]
plt.figure(figsize=(12, 16))
for ttt in range(len(imgs)):
    # imgs[ttt]=imgs[ttt]/255
    imgs[ttt]=imgs[ttt].astype(uint8)
    # print(type(imgs[ttt]),imgs[ttt].shape)
    plt.subplot(221+ttt)
    imgs[ttt][-1][-1]=255
    plt.imshow(imgs[ttt])
    plt.title(titles[ttt])
plt.show()

在这里插入图片描述

四张图:

  1. 原图
  2. 灰度翻转图:黑变白,白变黑
  3. 映射到[0,80]:总体变暗,对比度不变
  4. 像素平方后的图片:变暗了,对比度变小了

imgs[ttt][-1][-1]=255
我这里设置成这样是由于img3(映射到[0,80])出现了一点bug:img3效果和原图一样。调了半天bug,最后发现是matplotlib的问题。原因在于在使用imshow函数时,matplotlib默认使用线性映射将像素值转换为颜色。对于灰度图像,颜色映射是在[0, 255]范围内进行的。因此,尽管img3的像素值在[0, 80]的范围内,但matplotlib在显示时仍然将其映射到[0, 255]的灰度范围内,从而导致看起来与原始图像相同。

如下实验所示,img3的范围是[0,80],但是该图仍能显示高亮的[255]

img3=img3.astype(uint8)
print(max(img3.flatten()),min(img3.flatten()))
plt.subplot(111)
plt.imshow(img3)
80 0

在这里插入图片描述

1.3.4直方图均衡化

def histeq(im, nbr_bins=256):
    imhist, bins = histogram(im.flatten(), nbr_bins)
    cdf = imhist.cumsum()  
    cdf = 255 * cdf / cdf[-1]  
    im2 = interp(im.flatten(), bins[:-1], cdf)
    return im2.reshape(im.shape), cdf
from PIL import Image
from numpy import *
img = array(Image.open('jmu.jpg').convert('L'))
img2, cdf = histeq(img)


plt.figure(figsize=(14, 14))

# 1
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')

# 2
plt.subplot(2, 2, 2)
plt.imshow(img2)
plt.title('Equalized Image')


# 3
hist, bins = np.histogram(img.flatten(), bins=256, range=[0, 256])
plt.subplot(2, 2, 3)
plt.plot(hist, color='black')
plt.title('Original Image Hist')


# 4
hist, bins = np.histogram(img2.flatten(), bins=256, range=[0, 256])
plt.subplot(2, 2, 4)
plt.plot(hist, color='black')
plt.title('Equalized Image Hist')
Text(0.5, 1.0, 'Equalized Image Hist')

在这里插入图片描述

上图显示了原图和直方图均衡化的图,及其像素直方图。
从图片效果来看,差别不是很大(因为原来也没有特别不均衡),从直方图来看,完成了均衡化。

1.4SciPy

SciPy 提供很多高效的操作,可以实现数值积分、优化、统计、信号处理,以及对
我们来说最重要的图像处理功能

1.4.1图像模糊

图像的高斯模糊是非常经典的图像卷积例子。本质上,图像模糊就是将(灰度)图
I I I和一个高斯核进行卷积操作: I σ = I ∗ G σ I_{\sigma}=I*G_{\sigma} Iσ=IGσ
其中 * 表示卷积操作; G σ G_{\sigma} Gσ 是标准差为 σ \sigma σ 的二维高斯核,定义为 G σ = 1 2 π σ e − ( x 2 + y 2 ) / 2 σ 2 G_{\sigma}=\frac{1}{2\pi\sigma}\mathrm{e}^{-(x^{2}+y^{2})/2\sigma^{2}} Gσ=2πσ1e(x2+y2)/2σ2

from PIL import Image
import numpy as np
from scipy.ndimage import gaussian_filter

img = np.array(Image.open('jmu.jpg'))
img2 = zeros(img.shape)
for i in range(3):
    img2[:, :, i] = gaussian_filter(img[:, :, i], 5)

img2=uint8(img2)

plt.figure(figsize=(20, 40))

# 1
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')

# 2
plt.subplot(2, 2, 2)
plt.imshow(img2)
plt.title('Gaussian_filter Image')
plt.show()


在这里插入图片描述

1.4.2图像导数

在很多应用中图像强度的变化情况是非常重要的信息。强度的变化可以用灰度图像 I I I(对于彩色图像,通常对每个颜色通道分别计算导数)的 x和 y 方向导数 I x I_x Ix I y I_y Iy 进行描述。
图像的梯度向量为 ∣ ∇ I ∣ = [ I x , I y ] T \begin{vmatrix}\nabla\boldsymbol{I}\end{vmatrix}=[I_x,I_y]^T I =[Ix,Iy]T。梯度有两个重要的属性,一是梯度的大小: ∣ ∇ I ∣ = I x 2 + I y 2 \begin{vmatrix}\nabla\boldsymbol{I}\end{vmatrix}=\sqrt{\boldsymbol{I}_{x}^{2}+\boldsymbol{I}_{y}^{2}} I =Ix2+Iy2
它描述了图像强度变化的强弱,一是梯度的角度: α = arctan ⁡ 2 ( I y , I x ) \alpha=\arctan2(I_y,I_x) α=arctan2(Iy,Ix)

Prewitt 滤波器 D x = [ − 1 0 1 − 1 0 1 − 1 0 1 ] 和 D y = [ − 1 − 1 − 1 0 0 0 1 1 1 ] D_x=\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix}\text{和}D_y=\begin{bmatrix}-1&-1&-1\\0&0&0\\1&1&1\end{bmatrix} Dx= 111000111 Dy= 101101101

Sobel 滤波器
D x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] 和 D y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] D_x=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}\text{和}D_y=\begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix} Dx= 121000121 Dy= 101202101

from PIL import Image
from numpy import *
from scipy.ndimage import filters
import scipy

img = array(Image.open('tidu.jpg').convert('L'))

img_x = scipy.ndimage.sobel(img, axis=1)
img_y = scipy.ndimage.sobel(img, axis=0)

magnitude = np.sqrt(img_x**2 + img_y**2)
imgs=[img,img_x,img_y,magnitude]

titles=['Original image','sobel x','sobel y','sobel xy']
plt.figure(figsize=(15, 18))
for ttt in range(len(imgs)):
    # imgs[ttt]=imgs[ttt]/255
    imgs[ttt]=imgs[ttt].astype(uint8)
    # print(type(imgs[ttt]),imgs[ttt].shape)
    plt.subplot(221+ttt)
    plt.imshow(imgs[ttt])
    plt.title(titles[ttt])
plt.show()

在这里插入图片描述

用Sobel算子绘制了计算x和y的方向导数,可以看出图“sobel x”的线会竖直一些,而图“sobel y”的线会水平一些,这是由于不同的方向导数导致的。而通过综合两者np.sqrt(img_x2 + img_y2),则可以得出原图的大致轮廓。

1.4.3形态学:对象计数

from PIL import Image
import numpy as np
from scipy.ndimage import label
import copy

im =255- np.array(Image.open('dong.png').convert('L'))
im = 1 * (im < 128)

labels, nbr_objects = label(im)
plt.figure(figsize=(18, 18))
print("Number of objects:", nbr_objects)
plt.subplot(3, 3, 1)
plt.imshow(im)
plt.title('1-%d'%(nbr_objects))
for ttt in range(1, 9):
    # imgs[ttt]=imgs[ttt]/255
    imgt = copy.deepcopy(labels)
    imgt = 255*(imgt == ttt)
    # print(type(imgs[ttt]),imgs[ttt].shape)
    plt.subplot(3, 3, ttt+1)
    plt.imshow(imgt)
    plt.title(str(ttt))
plt.show()

Number of objects: 17

在这里插入图片描述

第一张显示了原图,通过函数可知,计数是17。为了使得可视化效果更好,我显示了部分计数(1-8)的图像

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

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

相关文章

基于Yolov2深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. 卷积神经网络&#xff08;CNN&#xff09; 4.2. YOLOv2 网络 4.3. 实现过程 4.4. 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心…

USB技术浅析

一、USB3.0 USB是史上定义出的最成功的PC外围互连技术&#xff0c;并且已经迅猛地被引入到CE和Mobile领域。仅仅在2006年&#xff0c;就有超过20亿USB设备出产&#xff0c;而现在已经有超过60亿的USB产品被安装。 而随着技术创新的不断前进&#xff0c;新式设备&#xff0c;媒…

在线考试系统springboot学生试卷问答管理java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 在线考试系统springboot 系统有2权限&#xff1a;管理…

物联网工程开发实施,应该怎么做?

我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 物联网工程的概念 物联网工程是研究物联网系统的规划、设计、实施、管理与维护的工程科学&#xff0c;要求物联网工程技术人员根 据既定的目标&#xff0c;依照国家、行业或企业规范&#xff0c;制定物联网…

Linux - 进程地址空间

引入 在学习C语言的时候&#xff0c;内存包括栈区、堆区、静态区 这个布局是内存吗&#xff1f; 不是&#xff01;&#xff01; 这是进程地址空间&#xff01; 下面测试一下&#xff1a; 11540是bash进程 我们修改一下源程序&#xff0c;在观察下结果 发现父进程的g_value的值不…

在terminal里面如何把图片从一个文件夹下面移动到另一个文件夹下面

使用命令行将图片从 /home/meiyi/Downloads/ 文件夹下移动到 Blog/blog/app/assets/images/ 文件夹下&#xff0c;可以按照以下步骤进行&#xff1a; 1. 打开 terminal 并进入 Blog/blog 目录下面 2.将图片移动到 app/assets/images/ 文件夹下面 可以使用mv命令将图片从 /ho…

xlrd与xlwt操作Excel文件详解

Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。下面是各个模块的支持情况&#xff1a; .xls.xlsx获取文件内容写入数据修改文件内容保存样式调整插入图片xlrd√√√xlwt√√√√√xlutils√√√√xlwings√√√√√…

虚拟云网络系列 | Antrea 应用于 VMware 方案功能简介(十二)

接续 Antrea 网络系列&#xff0c;接下来我想和大家讨论的是 Antrea 本身的两个网络与定址相关功能&#xff1a;Antrea Egress/Antrea IPAM。但在开始说明这两个机制前&#xff0c;先得讨论在原生 Kubernetes 方案内基础的网络与定址设计&#xff0c;通常在企业环境内会产生什么…

使用docker部署一个jar项目

简介: 通过docker镜像, docker可以在服务器上运行包含项目所需运行环境的docker容器, 在线仓库里有很多各个软件公司官方发布的镜像, 或者第三方的镜像. 如果我们需要使用docker把我们的应用程序打包成镜像, 别的机器上只要安装了docker, 就可以直接运行镜像, 而不需要再安装应…

建网站一般使用Windows还是liunx好?

建网站一般使用Windows还是liunx好&#xff1f; 1&#xff1b;服务器配置比较低时&#xff0c;最好使用linux系统。 对于一个电脑新手&#xff0c;刚开始做网站时&#xff0c;都会选择入门级的服务器&#xff0c;我刚开始做网站时&#xff0c;就是这样的。我购买了一台入门级服…

为什么需要智能工业自动化网络?如何搭建?

在当今快节奏的社会中&#xff0c;工业自动化变得越来越重要。传统的手动操作和生产方式已经不能满足现代工业的需求。因此&#xff0c;建设工业自动化已成为一个必然趋势。通过不断进步的新技术创建更高效、更可靠、更安全的智能工业自动化网络。在本文中&#xff0c;我们将讨…

【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读

原文链接&#xff1a;金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读 《金融数据安全 数据安全分级指南》 解 读 随着IT技术的发展&#xff0c;银行的基础业务、核心流程等众多事务和活动都运营在信息化基础之上&#xff0c;金融机构运行过程中产生了大量的数字…

SE-Net注意力机制详解

📌本次任务:了解SE-Net原理 SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。(这篇论文是2019年的,应该是后续做了更新) 一…

(Acwing)完全背包问题

有 N 种物品和一个容量是 V 的背包&#xff0c;每种物品都有无限件可用。 第 ii 种物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&am…

远程连接身份验证错误,又找不到加密Oracle修正

一、问题描述 远程连接服务器出现了错误&#xff0c;错误信息为&#xff1a;远程连接身份验证错误&#xff0c;又找不到加密Oracle修正。 二、原因分析 出错原因&#xff1a;Windows的CVE-2018-0886 的 CredSSP 更新将CredSSP 身份验证协议默认设置成了“缓解”&#xff0c;…

右键文件夹 ------- 打开 vscode的方法

1、右键vscode点击属性 2、这是地址栏&#xff0c;一会复制即可 3、新建一个txt文件,将这个复制进去 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\VSCode] "Open with Code" "Icon""D:\\Microsoft VS Code\\Code.exe"[HKE…

python编写小程序有界面,python编写小程序的运行

大家好&#xff0c;小编为大家解答python编写小程序怎么看代码的的问题。很多人还不知道python编写小程序的运行&#xff0c;现在让我们一起来看看吧&#xff01; Python第一个简单的小游戏 temp input("请猜一猜姐姐的幸运数字是&#xff1a; ") guess int(temp) …

图文演示:如何三分钟极速搭建一个元宇宙3D虚拟展厅

引言&#xff1a; 元宇宙3D虚拟展厅时代已经来临。元宇宙是一个虚拟的、立体的数字空间&#xff0c;可以让用户沉浸在其中进行交互操作&#xff0c;并体验无限可能。如何快速搭建一个属于自己的虚拟展厅则受到越来越多人的关注。 一&#xff0e;虚拟展厅类型 1.党建展馆 实现…

GoLand隐藏和折叠控制台的运行命令

GoLand上方菜单栏点击Help->Find Action -> 输入“Registry” 之后在找到【go.run.processes.with.pty】&#xff0c;关闭 参考&#xff1a; goland控制台显示重叠问题解决方案

【css】nth-child选择器实现表格的斑马纹效果

nth-child() 选择器可以实现为所有偶数&#xff08;或奇数&#xff09;的表格行添加css样式&#xff0c;even&#xff1a;偶数&#xff0c;odd&#xff1a;奇数。 代码&#xff1a; <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…