百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

小米10来了,我却盯上了它的图像处理技术

toyiye 2024-06-21 12:30 6 浏览 0 评论


2月13日,小米10和小米10 Pro的发布会终于通过网络直播的方式跟大家见面了。

被定义为“小米10年梦幻之作”的小米10,拍照仍是主打功能之一,全系列均采用了1亿像素主摄。


1亿像素是什么概念?

1亿像素传感器随便拍出的人像,可以放大很多倍。8倍放大之后,可以看清人眼里的眼球和血管,眼睫毛更是根根清楚。


搭乘长征四号乙运载火箭的小米10Pro

拍下了这组1亿像素的地球照片


从300万、500万到800万、1300万,以至现在的1亿,智能手机摄像头的像素始终在不断提升,那么这个像素到底代表的是什么?

像素是成像的最基本单位,打个比方,就好比用拼图拼一幅画,这个画里有多少块拼图,也就有多少个像素。像素数就是采样样本数,样本越多、灰度级越大,图像质量越好。


手机摄像头像素的增长代表着图像传感器精度的提高,但像素高不代表更清晰,对普通人来说,像素的显示方式才是更重要的。而对程序员来说,图像处理技术却是十分常用的,所以今天异步君就给大家唠唠计算机是如何处理图像的。


图像处理

1.什么是图像处理?


图像处理是指在计算机上使用算法和代码自动处理、操作、分析和解释图像,它广泛应用于诸多学科和领域,如电视、摄影、机器人、遥感、医学诊断和工业检验。像大众所熟知的 Facebook 和 Instagram 社交网站,面临用户每天都会上传大量图片的情况,它们是行业的典型案例,需要使用图像处理算法或对图像处理算法进行创新来处理上传的图片。

2.图像处理的应用


图像处理的典型应用包括医学/生物领域(如 X 射线和 CT 扫描)、计算摄影(Photoshop)、指纹认证、人脸识别等。


3.图像处理的流程


(1)图像的获取与存储。获取图像(如使用相机获取),并以文件的形式(如 JPEG文件)存储在某些设备(如硬盘)上。


(2)加载至内存并存盘。从磁盘读取图像数据至内存,使用某种数据结构(如 numpyndarray)作为存储结构,之后将数据结构序列化到一个图像文件中,也可能是对图像上运行了算法之后。


(3)操作、增强和复原。需运行预处理算法完成如下任务。

① 图像转换(采样和操作,如灰度转换);

② 图像质量增强(滤波,如图像由模糊变清晰);

③ 图像降噪,图像复原。


(4)图像分割。为了提取感兴趣的对象,需要对图像进行分割。


(5)信息提取/表示。图像需以其他形式表示,如表示为以下几项。

① 一些可从图像中计算出来的手工标识的特征描述符(如 HOG 描述符、经典图像处理)。

② 一些可自动从图像中学习的功能(例如,在深度学习神经网络的隐藏层中学到权重和偏差值)。

③ 以另一种表示方法表示图像。


(6)图像理解/图像解释。以下表示形式可用于更好地理解图像。


① 图像分类(例如,图像是否包含人类对象)。

② 对象识别(例如,在带有边框的图像中查找 car 对象的位置)。


图像处理流程如图所示。


用于各种图像处理任务的不同模块如图所示。


除此之外,还会用到以下图像处理模块:


(1)scipy.ndimage 和 opencv 用于不同图像处理;

(2)scikit-learn 用于经典的机器学习;

(3)tensorflow 和 keras 用于深度学习。

4.使用 Python 进行图像输入/输出和显示


由于图像是作为文件存储在磁盘上的,因此从文件中读取和写入图像是磁盘输入/输出操作。可以通过多种方式使用不同的库完成这些任务,本节给出了其中一些方式。

从导入所有必需的包开始,代码如下。


# for inline image display inside notebook

# % matplotlib inline

import numpy as np

from PIL import Image, ImageFont, ImageDraw

from PIL.ImageChops import add, subtract, multiply, difference, screen

import PIL.ImageStat as stat

from skimage.io import imread, imsave, imshow, show, imread_collection,

imshow_collection

from skimage import color, viewer, exposure, img_as_float, data

from skimage.transform import SimilarityTransform, warp, swirl

from skimage.util import invert, random_noise, montage

import matplotlib.image as mpimg

import matplotlib.pylab as plt

from scipy.ndimage import affine_transform, zoom

from scipy import misc


5.使用 PIL 读取、保存和显示图像


PIL 的 open() 函数用于从 Image 对象的磁盘读取图像,如下面的代码所示。图像作 为PIL.PngImagePlugin.PngImageFile类的对象加载,读者可以用宽度、高度和 模式等属性来查找图像的大小[宽度×高度(像素)或分辨率]和模式。


im = Image.open("../images/parrot.png") # read the image, provide the correct pathprint(im.width, im.height, im.mode, im.format, type(im))# 453 340 RGB PNG <class 'PIL.PngImagePlugin.PngImageFile'>im.show() # display the image 


运行上述代码,输出结果如图所示,从文件中读取图像,然后再将图像显示在屏幕上。


用 PIL 函数convert()将彩色 RGB 图像转换为灰度图像,代码如下:


im_g = im.convert('L') # convert the RGB color image to a grayscale image 
im_g.save('../images/parrot_gray.png') # save the image to disk
Image.open("../images/parrot_gray.png").show() # read the grayscale image from disk and show 


运行上述代码,结果如图所示,输出的是鹦鹉的灰度图像。



提供磁盘上图像的正确路径

建议创建一个文件夹(子目录)来存储要处理的图像(例如,对于 Python 代码示例, 建议读者使用名为 images 的文件夹来存储图像),然后提供文件夹的路径以访问图像, 以免出现“找不到文件”的异常。


6.使用 matplotlib 读取、保存和显示图像

接下来演示如何使用matplotlib.image中的imread()函数来读取浮点numpy ndarray 中的图像,其中,像素值表示为介于 0 和 1 之间的真值。代码如下:


im = mpimg.imread("../images/hill.png") # read the image from disk as a
numpy ndarray
print(im.shape, im.dtype, type(im)) # this image contains anα
channel, hence num_channels= 4
# (960, 1280, 4) float32 <class 'numpy.ndarray'>
plt.figure(figsize=(10,10))
plt.imshow(im) # display the image
plt.axis('off')
plt.show() 


运行上述代码,输出结果如图所示。

用 imread()函数读取的山峰图像


接下来展示如何将图像更改为较暗的图像。首先将所有像素值设置为 0~0.5 之间的 数,然后将 numpy ndarray 保存到磁盘。保存的图像将重新加载并显示。代码如下:


im1 = im
im1[im1 < 0.5] = 0 # make the image look darker
plt.imshow(im1)
plt.axis('off') 
plt.tight_layout()
plt.savefig("../images/hill_dark.png") # save the dark image
im = mpimg.imread("../images/hill_dark.png") # read the dark image
plt.figure(figsize=(10,10))
plt.imshow(im)
plt.axis('off') # no axis ticks
plt.tight_layout()
plt.show() 

运行上述代码,输出结果为较暗的山峰图像,如图所示。


使用 matplotlib imshow()在显示时插值

matplotlib 中的 imshow()函数提供了多种不同类型的插值方 法用以对图像进行绘制。当被绘制的图像很小时,这些方法特别有用。通过图所示的尺寸为 50×50 的 Lena 图像来查看用不同插 值方法绘制图像的效果。


如下代码演示了如何通过 imshow()使用不同的插值方法:


im = mpimg.imread("../images/lena_small.jpg") # read the image from disk as
a numpy ndarray
methods = ['none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'lanczos']
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(15, 30),subplot_kw={'xticks': [], 
'yticks': []})
fig.subplots_adjust(hspace=0.05, wspace=0.05)
for ax, interp_method in zip(axes.flat, methods):
ax.imshow(im, interpolation=interp_method)
ax.set_title(str(interp_method), size=20)
plt.tight_layout()
plt.show() 


运行上述代码,输出结果如图所示。


-END-

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码