小米10來了,我卻盯上了它的圖像處理技術


小米10來了,我卻盯上了它的圖像處理技術

2月13日,小米10和小米10 Pro的發佈會終於通過網絡直播的方式跟大家見面了。

被定義為“小米10年夢幻之作”的小米10,拍照仍是主打功能之一,全系列均採用了1億像素主攝。

小米10來了,我卻盯上了它的圖像處理技術


1億像素是什麼概念?

1億像素傳感器隨便拍出的人像,可以放大很多倍。8倍放大之後,可以看清人眼裡的眼球和血管,眼睫毛更是根根清楚。


搭乘長征四號乙運載火箭的小米10Pro

拍下了這組1億像素的地球照片

小米10來了,我卻盯上了它的圖像處理技術

小米10來了,我卻盯上了它的圖像處理技術

小米10來了,我卻盯上了它的圖像處理技術


從300萬、500萬到800萬、1300萬,以至現在的1億,智能手機攝像頭的像素始終在不斷提升,那麼這個像素到底代表的是什麼?

像素是成像的最基本單位,打個比方,就好比用拼圖拼一幅畫,這個畫裡有多少塊拼圖,也就有多少個像素。像素數就是採樣樣本數,樣本越多、灰度級越大,圖像質量越好。


手機攝像頭像素的增長代表著圖像傳感器精度的提高,但像素高不代表更清晰,對普通人來說,像素的顯示方式才是更重要的。而對程序員來說,圖像處理技術卻是十分常用的,所以今天異步君就給大家嘮嘮計算機是如何處理圖像的。


圖像處理

1.什麼是圖像處理?


圖像處理是指在計算機上使用算法和代碼自動處理、操作、分析和解釋圖像,它廣泛應用於諸多學科和領域,如電視、攝影、機器人、遙感、醫學診斷和工業檢驗。像大眾所熟知的 Facebook 和 Instagram 社交網站,面臨用戶每天都會上傳大量圖片的情況,它們是行業的典型案例,需要使用圖像處理算法或對圖像處理算法進行創新來處理上傳的圖片。

2.圖像處理的應用


圖像處理的典型應用包括醫學/生物領域(如 X 射線和 CT 掃描)、計算攝影(Photoshop)、指紋認證、人臉識別等。


3.圖像處理的流程


(1)圖像的獲取與存儲。獲取圖像(如使用相機獲取),並以文件的形式(如 JPEG文件)存儲在某些設備(如硬盤)上。


(2)加載至內存並存盤。從磁盤讀取圖像數據至內存,使用某種數據結構(如 numpyndarray)作為存儲結構,之後將數據結構序列化到一個圖像文件中,也可能是對圖像上運行了算法之後。


(3)操作、增強和復原。需運行預處理算法完成如下任務。

① 圖像轉換(採樣和操作,如灰度轉換);

② 圖像質量增強(濾波,如圖像由模糊變清晰);

③ 圖像降噪,圖像復原。


(4)圖像分割。為了提取感興趣的對象,需要對圖像進行分割。


(5)信息提取/表示。圖像需以其他形式表示,如表示為以下幾項。

① 一些可從圖像中計算出來的手工標識的特徵描述符(如 HOG 描述符、經典圖像處理)。

② 一些可自動從圖像中學習的功能(例如,在深度學習神經網絡的隱藏層中學到權重和偏差值)。

③ 以另一種表示方法表示圖像。


(6)圖像理解/圖像解釋。以下表示形式可用於更好地理解圖像。


① 圖像分類(例如,圖像是否包含人類對象)。

② 對象識別(例如,在帶有邊框的圖像中查找 car 對象的位置)。


圖像處理流程如圖所示。

小米10來了,我卻盯上了它的圖像處理技術


用於各種圖像處理任務的不同模塊如圖所示。

小米10來了,我卻盯上了它的圖像處理技術


除此之外,還會用到以下圖像處理模塊:


(1)scipy.ndimage 和 opencv 用於不同圖像處理;

(2)scikit-learn 用於經典的機器學習;

(3)tensorflow 和 keras 用於深度學習。

4.使用 Python 進行圖像輸入/輸出和顯示


由於圖像是作為文件存儲在磁盤上的,因此從文件中讀取和寫入圖像是磁盤輸入/輸出操作。可以通過多種方式使用不同的庫完成這些任務,本節給出了其中一些方式。

從導入所有必需的包開始,代碼如下。


<code># for inline image display inside notebook# % matplotlib inlineimport numpy as npfrom PIL import Image, ImageFont, ImageDrawfrom PIL.ImageChops import add, subtract, multiply, difference, screenimport PIL.ImageStat as statfrom skimage.io import imread, imsave, imshow, show, imread_collection,imshow_collectionfrom skimage import color, viewer, exposure, img_as_float, datafrom skimage.transform import SimilarityTransform, warp, swirlfrom skimage.util import invert, random_noise, montageimport matplotlib.image as mpimgimport matplotlib.pylab as pltfrom scipy.ndimage import affine_transform, zoomfrom scipy import misc/<code>


5.使用 PIL 讀取、保存和顯示圖像


PIL 的 open() 函數用於從 Image 對象的磁盤讀取圖像,如下面的代碼所示。圖像作 為PIL.PngImagePlugin.PngImageFile類的對象加載,讀者可以用寬度、高度和 模式等屬性來查找圖像的大小[寬度×高度(像素)或分辨率]和模式。


<code>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>im.show() # display the image /<class>/<code>


運行上述代碼,輸出結果如圖所示,從文件中讀取圖像,然後再將圖像顯示在屏幕上。

小米10來了,我卻盯上了它的圖像處理技術


用 PIL 函數convert()將彩色 RGB 圖像轉換為灰度圖像,代碼如下:


<code>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 diskImage.open("../images/parrot_gray.png").show() # read the grayscale image from disk and show /<code>


運行上述代碼,結果如圖所示,輸出的是鸚鵡的灰度圖像。


小米10來了,我卻盯上了它的圖像處理技術


提供磁盤上圖像的正確路徑

建議創建一個文件夾(子目錄)來存儲要處理的圖像(例如,對於 Python 代碼示例, 建議讀者使用名為 images 的文件夾來存儲圖像),然後提供文件夾的路徑以訪問圖像, 以免出現“找不到文件”的異常。


6.使用 matplotlib 讀取、保存和顯示圖像

接下來演示如何使用matplotlib.image中的imread()函數來讀取浮點numpy ndarray 中的圖像,其中,像素值表示為介於 0 和 1 之間的真值。代碼如下:


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


運行上述代碼,輸出結果如圖所示。

小米10來了,我卻盯上了它的圖像處理技術

用 imread()函數讀取的山峰圖像


接下來展示如何將圖像更改為較暗的圖像。首先將所有像素值設置為 0~0.5 之間的 數,然後將 numpy ndarray 保存到磁盤。保存的圖像將重新加載並顯示。代碼如下:


<code>im1 = imim1[im1 /<code>

運行上述代碼,輸出結果為較暗的山峰圖像,如圖所示。

小米10來了,我卻盯上了它的圖像處理技術


使用 matplotlib imshow()在顯示時插值

matplotlib 中的 imshow()函數提供了多種不同類型的插值方 法用以對圖像進行繪製。當被繪製的圖像很小時,這些方法特別有用。通過圖所示的尺寸為 50×50 的 Lena 圖像來查看用不同插 值方法繪製圖像的效果。

小米10來了,我卻盯上了它的圖像處理技術


如下代碼演示瞭如何通過 imshow()使用不同的插值方法:


<code>im = mpimg.imread("../images/lena_small.jpg") # read the image from disk asa numpy ndarraymethods = ['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() /<code>


運行上述代碼,輸出結果如圖所示。

小米10來了,我卻盯上了它的圖像處理技術


-END-


分享到:


相關文章: