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

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-

发布了516 篇原创文章 · 获赞 292 · 访问量 88万+

猜你喜欢

转载自blog.csdn.net/epubit17/article/details/104388088
今日推荐