(一)計算機視覺 --圖像處理基礎

目錄

一、PIL-Python圖像庫

1.1 讀取圖像並轉換灰度圖

1.2 對圖片進行格式轉換

1.3 創建縮略圖

1.4 拷貝並粘貼區域

1.5 調整尺寸和旋轉

二、Matplotlib庫

2.1 畫圖、描點和線

2.2 圖像輪廓和直方圖

2.3 交互式標註

三、NumPy庫

3.1 圖像數組表示

3.2 灰度變換

 3.3 調整圖像尺寸

3.4 直方圖均衡化

3.5 圖像平均

3.6 Pickle模塊 

四、SciPy模塊

4.1 圖像模糊

4.2 圖像差分

4.3 圖像降噪

4.4 有用的SciPy模塊

五、問題和總結

 

 


一、PIL-Python圖像庫

    PIL(圖像處理類庫)提供了通用的圖像處理功能,以及大量有用的基本圖像操作,比如圖像縮放、裁剪、旋轉、顏色轉換等。利用 PIL 中的函數,我們可以從大多數圖像格式的文件中讀取數據,然後寫入最常見的圖像格式文件中。PIL 中最重要的模塊爲 Image。要讀取一幅圖像,可以使用如下:

from PIL import Image

pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')  # 原始圖像

上述代碼的返回值 pil_im 是一個 PIL 圖像對象。

圖像的顏色轉換可以使用 convert() 方法來實現。要讀取一幅圖像,並將其轉換成灰度圖像,只需要加上 convert('L'),如下所示:

pil_im = Image.open('empire.jpg').convert('L')

 

1.1 讀取圖像並轉換灰度圖

實現代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *     # pylab庫畫圖功能

# 添加中文字體支持
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()

pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')  # 原始圖像
gray()
subplot(121)  # 一行兩列 ,第一個圖 (顯示)
title(u'原圖', fontproperties=font)
axis('off')
imshow(pil_im)

# 讀取圖像並轉換爲灰度圖像
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L')
subplot(122)
title(u'灰度圖', fontproperties=font)
axis('off')
imshow(pil_im)

show()  # 屏幕顯示

 

結果截圖:

 

1.2 對圖片進行格式轉換

    利用save()方法,PIL可以將圖片保存問很多不同的圖像格式。下面的例子從文件名列表(filelist)中讀取所有的圖像文件,並轉換成 JPEG 格式:

# -*- coding: utf-8 -*-
from PCV.tools.imtools import get_imlist  # 導入原書的PCV模塊
from PIL import Image
import os
import pickle

filelist = get_imlist('C:/Users/asus/Pictures/window/avg')  # 獲取文件夾下的圖片文件名

imlist = open('C:/Users/asus/Pictures/window/imlist.txt', 'wb')  # 將獲取的圖片文件列表保存到imlist.txt中

pickle.dump(filelist, imlist)  # 序列化
imlist.close()


for infile in filelist:
  outfile = os.path.splitext(infile)[0] + ".png"
  if infile != outfile:
    try:
      Image.open(infile).save(outfile)
    except IOError:
      print "cannot convert", infile

    PIL 的 open() 函數用於創建 PIL 圖像對象,save() 方法用於保存圖像到具有指定文件名的文件。除了後綴變爲“.png”,上述代碼的新文件名和原文件名相同。

結果如下圖,新增了三張與原圖名稱相同的png圖片:

   

1.3 創建縮略圖

    使用 PIL 可以很方便地創建圖像的縮略圖。thumbnail() 方法接受一個元組參數(該參數指定生成縮略圖的大小),然後將圖像轉換成符合元組參數指定大小的縮略圖。例如,創建最長邊爲 128 像素的縮略圖,可以使用下列命令:

pil_im.thumbnail((128,128))

1.4 拷貝並粘貼區域

    使用 crop() 方法可以從一幅圖像中裁剪指定區域,如下:

box = (100,100,400,400)
region = pil_im.crop(box)

    該區域使用四元組來指定。四元組的座標依次是(左,上,右,下)。PIL 中指定座標系的左上角座標爲(0,0)。我們可以旋轉上面代碼中獲取的區域,然後使用 paste() 方法將該區域放回去,具體實現如下:

region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)

1.5 調整尺寸和旋轉

    要調整一幅圖像的尺寸,我們可以調用 resize() 方法。該方法的參數是一個元組,用來指定新圖像的大小:

out = pil_im.resize((128,128))

要旋轉一幅圖像,可以使用逆時針方式表示旋轉角度,然後調用 rotate() 方法

out = pil_im.rotate(45)

 

    下面代碼顯示上面提到的所有的圖像處理操作,即原圖顯示、RGB圖像轉爲灰度圖像、拷貝粘貼區域、生成縮略圖、調整圖像尺寸、圖像旋轉變換的實例代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *

# 添加中文字體支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()

# 顯示原圖
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')
print(pil_im.mode, pil_im.size, pil_im.format)
subplot(231)
title(u'原圖', fontproperties=font)
axis('off')
imshow(pil_im)

# 顯示灰度圖
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L')
gray()
subplot(232)
title(u'灰度圖', fontproperties=font)
axis('off')
imshow(pil_im)

# 拷貝粘貼區域
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')
box = (100,100,400,400)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
subplot(233)
title(u'拷貝粘貼區域', fontproperties=font)
axis('off')
imshow(pil_im)

# 縮略圖
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')
size = 128, 128
pil_im.thumbnail(size)
print(pil_im.size)
subplot(234)
title(u'縮略圖', fontproperties=font)
axis('off')
imshow(pil_im)
pil_im.save('C:/Users/asus/Pictures/window/thumbnail.jpg')  # 保存縮略圖

# 調整圖像尺寸
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')
pil_im = pil_im.resize(size)
print(pil_im.size)
subplot(235)
title(u'調整尺寸後的圖像', fontproperties=font)
axis('off')
imshow(pil_im)

# 旋轉圖像45°
pil_im = Image.open('C:/Users/asus/Pictures/window/11.jpg')
pil_im = pil_im.rotate(45)
subplot(236)
title(u'旋轉45°後的圖像', fontproperties=font)
axis('off')
imshow(pil_im)

show()

結果截圖:

 

二、Matplotlib庫

    當在處理數學及繪圖或在圖像上描點、畫直線、曲線時,Matplotlib是一個很好的繪圖庫,它比PIL庫提供了更有力的特性。下面例子展示部分函數:

2.1 畫圖、描點和線

    雖然Matplotlib 可以繪製出較好的條形圖、餅狀圖、散點圖等,但是對於大多數計算機視覺應用來說,僅僅需要用到幾個繪圖命令。最重要的是,我們想用點和線來表示一些事物,比如興趣點、對應點以及檢測出的物體。下面是用幾個點和一條線繪製圖像的例子:

實現代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *

# 添加中文字體支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

# 讀取圖像到數組中
im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg'))
figure()

# 畫有座標軸的
subplot(121)
imshow(im)  # 繪製圖像

# 繪製一些點
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
plot(x, y, 'r*')  # red紅色的標記點
plot(x[:2], y[:2])  # 繪製連接前兩個點的線
title(u'繪圖: "11.jpg"', fontproperties=font)

# 不顯示座標軸
subplot(122)
imshow(im)
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
plot(x, y, 'r*')
plot(x[:2], y[:2])  # plot(x,y) 默認爲藍色實線
axis('off')   # 不顯示座標軸
title(u'繪圖: "11.jpg"', fontproperties=font)

show()

結果截圖:

2.2 圖像輪廓和直方圖

    在畫圖像輪廓前需要轉換爲灰度圖像,因爲輪廓需要獲取每個座標[x,y]位置的像素值。圖像的直方圖可以使用hist() 函數繪製,代碼如下:

 

figure()
hist(im.flatten(),128)
show()

    hist() 函數的第二個參數指定小區間的數目。需要注意的是,因爲 hist() 只接受一維數組作爲輸入,所以我們在繪製圖像直方圖之前,必須先對圖像進行壓平處理。flatten() 方法將任意數組按照行優先準則轉換成一維數組。 

下面是畫圖像輪廓和直方圖的代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *

# 添加中文字體支持
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'))  # 打開圖像,並轉成灰度圖像

figure()  # 新建一個圖像
subplot(121)
gray()  # 不使用顏色信息
contour(im, origin='image')  # 在原點的左上角顯示輪廓圖像
axis('equal')
axis('off')  # 不顯示座標軸
title(u'圖像輪廓', fontproperties=font)

subplot(122)
hist(im.flatten(), 128)
title(u'圖像直方圖', fontproperties=font)
plt.xlim([0, 260])
plt.ylim([0, 11000])

show()

結果截圖:

2.3 交互式標註

    有時,用戶需要和應用進行交互,比如在圖像中用點做標識,或者在一些訓練數據中進行註釋。PyLab提供了一個很簡潔好用的函數ginput(),它可以完成該任務,下面是一個演示交互註釋的簡短示例:

from PIL import Image
from pylab import *

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg'))
imshow(im)
print('Please click 3 points')
imshow(im)
x = ginput(3)
print('You clicked:', x)

show()

上面代碼先讀取11.jpg圖像,顯示讀取的圖像,然後用ginput()交互註釋,這裏設置的交互註釋數據點設置爲3個,用戶在註釋後,會將註釋點的座標打印出來。

標註結果:

 

三、NumPy庫

    NumPy是Python一個流行的用於科學計算包,其中包含了大量有用的思想,比如數組對象(用來表示向量、矩陣、圖像等)以及線性代數函數。

3.1 圖像數組表示

    在前面載入圖像的示例中,我們將圖像用array()函數轉爲NumPy數組對象,但是並沒有提到它表示的含義。數組就像列表一樣,只不過它規定了數組中的所有元素必須是相同的類型。下面的例子用於說明圖像數組表示:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg'))
print(im.shape, im.dtype)

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'), 'f')
print(im.shape, im.dtype)

 

運行代碼顯示的結果:

    每行的第一個元組表示圖像數組的大小(行、列、顏色通道),緊接着的字符串表示數組元素的數據類型。因爲圖像通常被編碼成無符號八位整數(uint8),所以在第一種情況下,載入圖像並將其轉換到數組中,數組的數據類型爲“uint8”。在第二種情況下,對圖像進行灰度化處理,並且在創建數組時使用額外的參數“f”;該參數將數據類型轉換爲浮點型。注意,由於灰度圖像沒有顏色信息,所以在形狀元組中,它只有兩個數值。

    數組中的元素可以使用下標訪問。位於座標 ij,以及顏色通道 k 的像素值可以像下面這樣訪問:

value = im[i,j,k]

 

    多個數組元素可以使用數組切片方式訪問。切片方式返回的是以指定間隔下標訪問該數組的元素值。下面是有關灰度圖像的一些例子:

im[i,:] = im[j,:]      # 將第 j 行的數值賦值給第 i 行
im[:,i] = 100          # 將第 i 列的所有數值設爲100
im[:100,:50].sum()     # 計算前100 行、前 50 列所有數值的和
im[50:100,50:100]      # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
im[i].mean()           # 第 i 行所有數值的平均值
im[:,-1]               # 最後一列
im[-2,:] (or im[-2])   # 倒數第二行

    注意,示例僅僅使用一個下標訪問數組。如果僅使用一個下標,則該下標爲行下標。在最後幾個例子中,負數切片表示從最後一個元素逆向計數。我們將會頻繁地使用切片技術訪問像素值,這也是一個很重要的思想。 

3.2 灰度變換

    在讀入圖像到NumPy數組後,就可以對它進行任何我們想要的操作了。對圖像進行灰度變換便是一個簡單的例子。這裏給出一些進行灰度變換的例子:

# -*- coding: utf-8 -*-
from PIL import Image
from numpy import *
from pylab import *

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'))
print(int(im.min()), int(im.max()))

im2 = 255 - im  # 對圖像進行反相處理
print(int(im2.min()), int(im2.max()))

im3 = (100.0/255) * im + 100  # 將圖像像素值變換到100...200 區間
print(int(im3.min()), int(im3.max()))

im4 = 255.0 * (im/255.0)**2  # 對圖像像素值求平方後得到的圖像
print(int(im4.min()), int(im4.max()))

figure()
gray()
subplot(1, 3, 1)
imshow(im2)
axis('off')
title(r'$f(x)=255-x$')

subplot(1, 3, 2)
imshow(im3)
axis('off')
title(r'$f(x)=\frac{100}{255}x+100$')

subplot(1, 3, 3)
imshow(im4)
axis('off')
title(r'$f(x)=255(\frac{x}{255})^2$')

show()

結果:

上面左邊灰度變換函數採用的是 f(x)=255-x,中間採用的是 f(x)=(100/255)x+100,右邊採用的是變換函數是 f(x)=255(x/255)^2。

正如上面代碼所示,你可以用通過下面命令檢查每幅圖像的最小值和最大值:

print(int(im.min()), int(im.max()))

如果你對每幅圖像用到了打印最小像素值和最大像素值,你會得到下面的輸出結果:

1 255
0 254
100 200
0 255

array() 變換的相反操作可以使用 PIL 的 fromarray() 函數完成:

pil_im = Image.fromarray(im)

如果你通過一些操作將“uint8”數據類型轉換爲其他數據類型,比如之前例子中的 im3 或者 im4,那麼在創建 PIL 圖像之前,需要將數據類型轉換回來:

pil_im = Image.fromarray(uint8(im))

如果你並不十分確定輸入數據的類型,安全起見,應該先轉換回來。注意,NumPy 總是將數組數據類型轉換成能夠表示數據的“最低”數據類型。對浮點數做乘積或除法操作會使整數類型的數組變成浮點類型。 

 

 3.3 調整圖像尺寸

    NumPy數組將成爲我們對圖像及數據進行處理的最主要工具,但是調整矩陣大小並沒有一種簡單的方法。我們可以用PIL圖像對象轉換寫一個簡單的圖像尺寸調整函數:

def imresize(im,sz):
    """    Resize an image array using PIL. """
    pil_im = Image.fromarray(uint8(im))

    return array(pil_im.resize(sz))

3.4 直方圖均衡化

    圖像灰度變換中一個非常有用的例子就是直方圖均衡化。直方圖均衡化是指將一幅圖像的灰度直方圖變平,使變換後的圖像中每個灰度值的分佈概率都相同。在對圖像做進一步處理之前,直方圖均衡化通常是對圖像灰度值進行歸一化的一個非常好的方法,並且可以增強圖像的對比度。

下面是對圖像直方圖進行均衡化處理的代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.tools import imtools

# 添加中文字體支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'))  # 打開圖像,並轉成灰度圖像
im2, cdf = imtools.histeq(im)

figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始圖像', fontproperties=font)
imshow(im)

subplot(2, 2, 2)
axis('off')
title(u'直方圖均衡化後的圖像', fontproperties=font)
imshow(im2)

subplot(2, 2, 3)
axis('off')
title(u'原始直方圖', fontproperties=font)
hist(im.flatten(), 128, normed=True)

subplot(2, 2, 4)
axis('off')
title(u'均衡化後的直方圖', fontproperties=font)
hist(im2.flatten(), 128, normed=True)

show()

結果截圖:

3.5 圖像平均

    對圖像取平均是一種圖像降噪的簡單方法,經常用於產生藝術效果。假設所有的圖像具有相同的尺寸,我們可以對圖像相同位置的像素相加取平均,下面是一個演示對圖像取平均的例子:

# -*- coding: utf-8 -*-
from PCV.tools.imtools import get_imlist
from PIL import Image
from pylab import *
from PCV.tools import imtools

# 添加中文字體支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

filelist = get_imlist('C:/Users/asus/Pictures/window//avg/')  # 獲取convert_images_format_test文件夾下的圖片文件名(包括後綴名)
avg = imtools.compute_average(filelist)

for impath in filelist:
        im1 = array(Image.open(impath))
        subplot(2, 2, filelist.index(impath)+1)
        imshow(im1)
        imNum = str(filelist.index(impath)+1)
        title(u'待平均圖像'+imNum, fontproperties=font)
        axis('off')
subplot(2, 2, 4)
imshow(avg)
title(u'平均後的圖像', fontproperties=font)
axis('off')

show()

 

結果截圖:

 

 

 

3.6 Pickle模塊 

    如果你想將結果保存下來,或者將數據保存下來以便後面使用,那麼pickle模塊是非常有用的。Pickle模塊能夠獲取幾乎所有的Python對象,並將它轉換成字符串表示,該過程稱爲封裝;從字符串表示重構對象的過程爲拆封。下面用一個例子對其進行說明。正如你在上面註釋部分看到的一樣,假設我們想將前一節字體圖像的平均值和主成分保存起來,可以通過下面操作:

f = open('../data/fontimages/font_pca_modes.pkl', 'wb')
pickle.dump(immean,f)
pickle.dump(V,f)
f.close()

上面在使用封裝操作前,需要導入pickle模塊。如果要載入保存的.pkl數據,可以通過load()方法,如下:

# load mean and principal components
f = open('../data/fontimages/font_pca_modes.pkl', 'rb')
immean = pickle.load(f)
V = pickle.load(f)
f.close()

四、SciPy模塊

    SciPy是一個開源的數學工具包,它是建立在NumPy的基礎上的。它提供了很多有效的常規操作,包括數值綜合、最優化、統計、信號處理以及圖像處理。正如接下來所展示的,SciPy庫包含了很多有用的模塊。

4.1 圖像模糊

一個經典的並且十分有用的圖像卷積例子是對圖像進行高斯模糊。高斯模糊可以用於定義圖像尺度、計算興趣點以及很多其他的應用場合。如下例子:

代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters

# 添加中文字體支持
from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'))

figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原圖', fontproperties=font)
imshow(im)

for bi, blur in enumerate([2, 5, 10]):
    im2 = zeros(im.shape)
    im2 = filters.gaussian_filter(im, blur)
    im2 = np.uint8(im2)
    imNum = str(blur)
    subplot(1, 4, 2 + bi)
    axis('off')
    title(u'標準差爲' + imNum, fontproperties=font)
    imshow(im2)

# 如果是彩色圖像,則分別對三個通道進行模糊
# for bi, blur in enumerate([2, 5, 10]):
#  im2 = zeros(im.shape)
#  for i in range(3):
#    im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur)
#  im2 = np.uint8(im2)
#  subplot(1, 4,  2 + bi)
#  axis('off')
#  imshow(im2)

show()

結果截圖:

4.2 圖像差分

    圖像強度的改變是一個重要的信息,被廣泛用以很多應用中。下面是圖像差分的例子。

代碼:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters
import numpy

# 添加中文字體支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'))
gray()

subplot(1, 4, 1)
axis('off')
title(u'(a)原圖', fontproperties=font)
imshow(im)

# Sobel derivative filters
imx = zeros(im.shape)
filters.sobel(im, 1, imx)
subplot(1, 4, 2)
axis('off')
title(u'(b)x方向差分', fontproperties=font)
imshow(imx)

imy = zeros(im.shape)
filters.sobel(im, 0, imy)
subplot(1, 4, 3)
axis('off')
title(u'(c)y方向差分', fontproperties=font)
imshow(imy)

mag = 255-numpy.sqrt(imx**2 + imy**2)
subplot(1, 4, 4)
title(u'(d)梯度幅度', fontproperties=font)
axis('off')
imshow(mag)

show()

結果截圖:

4.3 圖像降噪

    圖像降噪是一個在儘可能保持圖像細節和結構信息時去除噪聲的過程。我們採用Rudin-Osher-Fatemi de-noising(ROF)模型。圖像去噪可以應用於很多場合,它涵蓋了從你的度假照片使之更好看到衛星照片質量提高。

下面顯示圖像降噪的代碼例子:

# -*- coding: utf-8 -*-
from PCV.tools import rof
from PIL import Image
from pylab import *
from scipy.ndimage import filters

""" This is the de-noising example using ROF in Section 1.5. """

# 添加中文字體支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('C:/Users/asus/Pictures/window/11.jpg').convert('L'))

U,T = rof.denoise(im,im)
G = filters.gaussian_filter(im, 10)


# save the result
# imsave('synth_original.pdf',im)
# imsave('synth_rof.pdf',U)
# imsave('synth_gaussian.pdf',G)


# plot
figure()
gray()

subplot(1, 3, 1)
imshow(im)
# axis('equal')
axis('off')
title(u'原噪聲圖像', fontproperties=font)

subplot(1, 3, 2)
imshow(G)
# axis('equal')
axis('off')
title(u'高斯模糊後的圖像', fontproperties=font)

subplot(1, 3, 3)
imshow(U)
# axis('equal')
axis('off')
title(u'ROF降噪後的圖像', fontproperties=font)

show()

 

結果截圖:

 

4.4 有用的SciPy模塊

SciPy有一些用於輸入和輸出數據有用的模塊,其中兩個是io和misc。

讀寫.mat文件

如果你有一些數據存儲在Matlab .mat文件中,可以用scipy.io模塊讀取:

data = scipy.io.loadmat('test.mat')

如果要保存到.mat文件中的話,同樣也很容易,僅僅只需要創建一個字典,字典中即可保存你想保存的所有變量,然後用savemat()方法即可:

#創建字典
data = {}
#將變量x保存在字典中
data['x'] = x
scipy.io.savemat('test.mat',data)

保存數組爲圖像

在scipy.misc模塊中,包含了imsave()函數,要保存數組爲一幅圖像,可通過下面方式完成:

from scipy.misc import imsave
imsave('test.jpg',im)

scipy.misc模塊中還包含了著名的"Lena"測試圖像:

lena = scipy.misc.lena()

 上面得到的lena圖像是一幅512*512大小的灰度圖像。

五、問題和總結

(1)在進行圖片格式的轉換時遇到下面的問題,用file來獲取圖片文件列表時提示未解析的引用了“file”。查資料發現是python版本升級,函數的使用有所變化。我的python是3.7的,所以把 file函數改爲 open函數可解決這個問題。

      

使用open函數之後又發現還有一處錯誤提示,如下圖:

查資料發現Python2隨機寫入二進制文件是 ‘w’,但是使用python3就會報錯 write()參數必須是str,而不是bytes 。原因是Python3給open函數添加了名爲 encoding 的新參數,而這個新參數的默認值卻是 ‘utf-8’ 。這樣在文件句柄上進行 read和 write操作時,系統就要求開發者必須傳入包含Unicode 字符的實例,而不接受包含二進制數據的bytes實例。

解決方法是:使用二進制寫入模式(‘wb’)來開啓待操作文件,而不能像原來那樣,採用字符寫入模式(‘w’)。文件讀取數據的時候也有類似的問題。解決這種問題的辦法也相似:用'rb'模式(二進制模式)打開文件,而不要使用'r'模式。

(2)使用MatplotLib畫圖描 點和線的時候,畫線的代碼如下:

x = [100, 100, 400, 400]
y = [200, 500, 200, 500]

plot(x, y, 'r*')  # red紅色的標記點

plot(x[1:3], y[1:3])  # 繪製連接左下點和右上點的線
plot(x[1:3], y[:2])  # 繪製連接左上點和右下點的線
plot(x[:2], y[:2])  # 繪製連接前兩個點的線

title(u'繪圖: "11.jpg"', fontproperties=font)

 

使用plot(x,y)來劃線時,像上面三種情況的線我都理解了怎麼畫,但是想知道怎麼畫橫着的線,比如連接最上面的兩個點,這一個內容自己試了好久都沒有畫出來,之後還得找找其他的資料,更多的學習一下。

總結:這次將圖像處理的一些基本內容幾乎都寫在了文章裏,對使用python進行圖像處理有了基本的瞭解。文章寫的圖像處理中包括了很多的函數和方法(藍色字體),有一些函數方法自己還是不太瞭解。還有關於python版本的不同引發的一些運行錯誤,現在瞭解的還很少,可能在以後的學習中還會遇到很多的問題,邊學邊瞭解。

參考資料:http://yongyuan.name/pcvwithpython/chapter1.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章