欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

基本圖像操作和處理(python)

系統(tǒng) 1609 0

PIL提供了通用的圖像處理功能,以及大量的基本圖像操作,如圖像縮放、裁剪、旋轉(zhuǎn)、顏色轉(zhuǎn)換等。

Matplotlib提供了強(qiáng)大的繪圖功能,其下的pylab/pyplot接口包含很多方便用戶創(chuàng)建圖像的函數(shù)。

為了觀察和進(jìn)一步處理圖像數(shù)據(jù),首先需要加載圖像文件,并且為了查看圖像數(shù)據(jù),我們需要將其繪制出來。

          
            from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# 加載圖像
img = Image.open("tmp.jpg")
# 轉(zhuǎn)為數(shù)組
img_data = np.array(img)
# 可視化
plt.imshow(img_data)
plt.show()
          
        

對(duì)于圖像,我們常見的操作有調(diào)整圖像尺寸,旋轉(zhuǎn)圖像以及灰度變換

          
            from PIL import Image
import matplotlib.pyplot as plt

img = Image.open("girl.jpg")

plt.figure()
# 子圖
plt.subplot(221)
# 原圖
plt.imshow(img)
plt.subplot(222)
# 將圖像縮放至 256 * 256
plt.imshow(img.resize((256, 256)))
plt.subplot(223)
# 將圖像轉(zhuǎn)為灰度圖
plt.imshow(img.convert('L'))
plt.subplot(224)
# 旋轉(zhuǎn)圖像
plt.imshow(img.rotate(45))
# 保存圖像
plt.savefig("tmp.jpg")
plt.show()
          
        

效果演示 :
基本圖像操作和處理(python)_第1張圖片

在平常的使用中,繪制圖像的輪廓也經(jīng)常被使用,因?yàn)槔L制輪廓需要對(duì)每個(gè)坐標(biāo)(x, y)的像數(shù)值施加同一個(gè)闕值,所以需要將圖像灰度化

          
            from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

img = Image.open("girl.jpg")

gray_img = np.array(img.convert('L'))
plt.figure()
# 繪制圖像灰度化
plt.gray()
# 關(guān)閉坐標(biāo)軸
plt.axis('off')
# 繪制灰度圖像
plt.contour(gray_img, origin='image')
plt.figure()
# 繪制直方圖,flatten()表示將數(shù)組展平
plt.hist(gray_img.flatten(), 128)
plt.show()

          
        

輪廓圖及直方圖:

基本圖像操作和處理(python)_第2張圖片 基本圖像操作和處理(python)_第3張圖片

圖像的直方圖用來表征該圖像的像素值的分布情況。用一定數(shù)目的小區(qū)間來指定表征像素值的范圍,每個(gè)小區(qū)間會(huì)得到落入該小區(qū)間表示范圍的像素?cái)?shù)目。hist()函數(shù)用于繪制圖像的直方圖,其只接受一維數(shù)組作為第一個(gè)參數(shù)輸入,其第二個(gè)參數(shù)用于指定小區(qū)間的數(shù)目。

有時(shí)用戶需要和應(yīng)用進(jìn)行交互,如在一幅圖像中標(biāo)記一些點(diǎn)。Pylab/pyplot庫中的ginput()函數(shù)就可以實(shí)現(xiàn)交互式標(biāo)注

          
            from PIL import Image
import matplotlib.pyplot as plt


img = Image.open(r"girl.jpg")
plt.imshow(img)
x = plt.ginput(3)
print("clicked point: ", x)
          
        

注:該交互在集成編譯環(huán)境(pyCharm)中如果不能調(diào)出交互窗口則無法進(jìn)行點(diǎn)擊,可以在命令窗口下成功執(zhí)行。

以上我們通過numpy的array()函數(shù)將Image對(duì)象轉(zhuǎn)換成了數(shù)組,以下將展示如何從數(shù)組轉(zhuǎn)換成Image對(duì)象

          
            from PIL import Image
import numpy as np


img = Image.open(r"girl.jpg")
img_array = np.array(img)
img = Image.fromarray(img_array)
          
        

在圖像灰度變換中有一個(gè)非常有用的例子就是 直方圖均衡化 。直方圖均衡化是指將一幅圖像的灰度直方圖變平,使變換后的圖像中每個(gè)灰度值的分布概率都相同。直方圖均衡化通常是對(duì)圖像灰度值進(jìn)行歸一化的一個(gè)非常好的方法,并且可以增強(qiáng)圖像的對(duì)比度。

直方圖均衡化的變換函數(shù)是圖像中像素值的 累積分布函數(shù) (cumulative distribution function,將像素值的范圍映射到目標(biāo)范圍的歸一化操作)。

          
            from PIL import Image
import matplotlib.pyplot as plt
import numpy as np


def histogram_equalization(img: np, nbr_bins=256):
    imhist, bins = np.histogram(img.flatten())
    cdf = imhist.cumsum() # 累計(jì)分布函數(shù)
    # 歸一化
    cdf = 255 * cdf / cdf[-1]
    # 使用累積分布函數(shù)進(jìn)行線性插值,計(jì)算新的像素值
    img2 = np.interp(img.flatten(), bins[:-1], cdf)
    return img2.reshape(img.shape), cdf


img = Image.open(r"girl.jpg").convert('L')
img2, cdf = histogram_equalization(np.array(img))
plt.figure()
plt.gray()
# 繪制子圖
plt.subplot(232)
# 變換函數(shù)
plt.plot(cdf)
plt.subplot(231)
plt.hist(np.array(img).flatten(), 256)
# 關(guān)閉坐標(biāo)軸,對(duì)上一個(gè)子圖有效
plt.axis('off')
plt.subplot(233)
plt.hist(np.array(img2).flatten(), 256)
plt.axis('off')
plt.subplot(234)
plt.imshow(img)
plt.axis('off')
plt.subplot(236)
plt.imshow(img2)
plt.axis('off')
# 保存繪制圖像
plt.savefig("tmp.jpg")
plt.show()


          
        

處理結(jié)果

基本圖像操作和處理(python)_第4張圖片

可見,直方圖均衡化的圖像的對(duì)比度增強(qiáng)了,原先圖像灰色區(qū)域的斜街變得清晰。
PCA(Principal Component Analysis, 主成分分析)是一個(gè)非常有用的降維技巧,它可以在使用盡可能少的維數(shù)的前提下,盡可能多地保持訓(xùn)練數(shù)據(jù)的信息。詳細(xì)介紹及使用見我的另一篇文章:PCA降維

SciPy是建立在Numpy基礎(chǔ)上,用于數(shù)值運(yùn)算的開源工具包。Scipy提供很多高效的操作,可以實(shí)現(xiàn)數(shù)值積分、優(yōu)化、統(tǒng)計(jì)、信號(hào)處理,以及對(duì)我們來說最為重要的圖像處理功能。

圖像的 高斯模糊 是非常經(jīng)典的圖像卷積例子。本質(zhì)上,圖像模糊就是將(灰度)圖像 \(I\) 和一個(gè)高斯核進(jìn)行卷積操作:
\[ I_\sigma = I * G_\sigma \]
其中, \(*\) 表示卷積操作; \(G\) 表示標(biāo)準(zhǔn)差為 \(\sigma\) 的二維高斯核,定義為:
\[ G_\sigma = \frac{1}{2\pi \sigma^2} e^{-(x^2+y^2) / 2 \sigma^2} \]
高斯模糊通常是其他圖像處理操作的一部分,比如圖像插值操作、興趣點(diǎn)計(jì)算以及其他應(yīng)用。

Scipy有用來做濾波操作的scipy.ndimage.filters模塊。該模塊使用快速一維分離的方式來計(jì)算卷積。使用方式:

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


img = Image.open(r"girl.jpg").convert('L')
img = np.array(img)
img2 = filters.gaussian_filter(img, 2)
img3 = filters.gaussian_filter(img, 5)
img4 = filters.gaussian_filter(img, 10)
          
        

繪制結(jié)果
基本圖像操作和處理(python)_第5張圖片

上面使用的gaussian_filter()函數(shù)中的后一個(gè)參數(shù)表示標(biāo)準(zhǔn)差 \(\sigma\) ,可見隨著 \(\sigma\) 的增加,圖像變得越來越模糊。 \(\sigma\) 越大,處理后圖像細(xì)節(jié)丟失越多。如果是打算模糊一幅彩色圖像,只需要簡(jiǎn)單地對(duì)每一個(gè)顏色通道進(jìn)行高斯模糊:

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


img = Image.open(r"girl.jpg")
img = np.array(img)
img2 = np.zeros(img.shape)
for i in range(img2.shape[2]):
    img2[:, :, i] = filters.gaussian_filter(img[:, :, i], 5)
# 將像素值用八位表示
img2 = np.array(img2, 'uint8')
          
        

模糊結(jié)果:
基本圖像操作和處理(python)_第6張圖片

在很多應(yīng)用中,圖像強(qiáng)度的變化情況是非常重要的,強(qiáng)度的變化可以使用灰度圖像的 \(x\) \(y\) 方向?qū)?shù) \(I_x\) \(I_y\) 進(jìn)行描述

圖像的梯度向量為 \(\bigtriangledown I = [I_x, I_y]^T\) 。梯度有兩個(gè)重要屬性,一是梯度的大小:
\[ | \bigtriangledown I | = \sqrt{I_x^2 + I_y^2} \]
它描述了圖像強(qiáng)度變化的強(qiáng)弱,另一個(gè)是圖像的角度:
\[ \alpha = arctan2(I_x, I_y) \]
它描述了圖像在每個(gè)點(diǎn)上強(qiáng)度變化最大的方向。Numpy中的arctan2()函數(shù)返回弧度表示的有符號(hào)角度,角度的變化區(qū)間為 \((-\pi, \pi)\)
可以使用離散近似的方式來計(jì)算圖像的導(dǎo)數(shù)。圖像倒數(shù)大多數(shù)可以通過卷積簡(jiǎn)單地實(shí)現(xiàn):
\[ I_x = I*D_x 和 I_y = I*D_y \]
對(duì)于 \(D_x\) \(D_y\) ,通常選擇Prewitt濾波器:
\[ D_x = \left[ \begin{matrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{matrix} \right] \]

\[ D_y = \left[ \begin{matrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{matrix} \right] \]
或者Sobel濾波器
\[ D_x = \left[ \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right] \]

\[ D_y = \left[ \begin{matrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{matrix} \right] \]
這些導(dǎo)數(shù)濾波器可以使用scipy.ndimage.filters模塊地標(biāo)準(zhǔn)卷積操作來簡(jiǎn)單地實(shí)現(xiàn)

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


img = Image.open(r"girl.jpg").convert('L')
img = np.array(img)
imgx = np.zeros(img.shape)
# Sobel導(dǎo)數(shù)濾波器
filters.sobel(img, 1, imgx)

imgy = np.zeros(img.shape)
filters.sobel(img, 0, imgy)

magnitude = np.sqrt(imgx**2+imgy**2)
          
        

基本圖像操作和處理(python)_第7張圖片

sobel()函數(shù)的第二個(gè)參數(shù)選擇 \(x\) \(y\) 方向的導(dǎo)數(shù),第三個(gè)參數(shù)保存輸出變量。在圖像中,正導(dǎo)數(shù)顯示為亮的像素,負(fù)導(dǎo)數(shù)顯示為暗的像素,灰色區(qū)域表示導(dǎo)數(shù)的值接近零。

上面計(jì)算圖像導(dǎo)數(shù)的方法存在缺陷:在該方法中,濾波器的尺度需要隨著圖像分辨率的變化而變化(?)。為了在圖像噪聲方面更穩(wěn)健,以及在任意尺度上計(jì)算導(dǎo)數(shù),我們可以使用 高斯導(dǎo)數(shù)濾波器:
\[ I_x = I * G_{\sigma x} 和 I_y = I*G_{\sigma y} \]
其中, \(G_{\sigma x}\) \(G_{\sigma y}\) 表示 \(G_\sigma\) \(x\) \(y\) 方向上的導(dǎo)數(shù), \(G_\sigma\) 表示標(biāo)準(zhǔn)差為 \(\sigma\) 的高斯函數(shù)。以下給出使用樣例:

          
            from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import filters

img = Image.open(r"girl.jpg").convert('L')
img = np.array(img)

sigma = 2
imgx = np.zeros(img.shape)
imgy = np.zeros(img.shape)
filters.gaussian_filter(img, (sigma, sigma), (0, 1), imgx)
filters.gaussian_filter(img, (sigma, sigma), (1, 0), imgy)

magnitude = np.sqrt(imgx**2+imgy**2)
          
        

結(jié)果演示:
基本圖像操作和處理(python)_第8張圖片

在對(duì)圖像進(jìn)行處理時(shí),去噪也是很重要的一環(huán)。 圖像去噪 是在去除圖像噪聲的同時(shí),盡可能地保留圖像細(xì)節(jié)和結(jié)構(gòu)地處理技術(shù),以下給出使用ROF去噪模型地Demo:

          
            from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import filters


def de_noise(img, U_init, tolerance=0.1, tau=0.125, tv_weight=100):
    U = U_init
    Px = Py = img
    error = 1
    while error > tolerance:
        Uold = U
        # 變量U梯度的x分量
        gradUx = np.roll(U, -1, axis=1)-U
        # 變量U梯度的y分量
        gradUy = np.roll(U, -1, axis=0)-U

        # 更新對(duì)偶變量
        PxNew = Px + (tau/tv_weight)*gradUx
        PyNew = Py + (tau/tv_weight)*gradUy
        NormNew = np.maximum(1, np.sqrt(PxNew**2+PyNew**2))

        # 更新x,y分量
        Px = PxNew / NormNew
        Py = PyNew / NormNew

        # 更新原始變量
        RxPx = np.roll(Px, 1, axis=1)  # 將x分量向x軸正方向平移
        RyPy = np.roll(Py, 1, axis=0)  # 將y分量向y軸正方向平移

        DivP = (Px - RxPx) + (Py - RyPy)  # 對(duì)偶域散度
        U = img + tv_weight * DivP

        error = np.linalg.norm(U - Uold)/np.sqrt(img.shape[0] * img.shape[1])

        return U, img-U


if __name__ == '__main__':
    im = np.zeros((500, 500))
    im[100:400,100:400] = 128
    im[200:300, 200:300] = 255
    im = im + 30 * np.random.standard_normal((500, 500))

    U, T = de_noise(im, im)
    G = filters.gaussian_filter(im, 10)
    plt.figure()
    plt.gray()
    plt.subplot(221).set_title("Original image")
    plt.axis('off')
    plt.imshow(im)
    plt.subplot(222).set_title("Gauss blurred image")
    plt.axis('off')
    plt.imshow(G)
    plt.subplot(223).set_title("ROF")
    plt.axis('off')
    plt.imshow(U)
    plt.savefig('tmp.jpg')
    plt.show()

          
        

結(jié)果演示
基本圖像操作和處理(python)_第9張圖片

ROF去噪后的圖像保留了邊緣和圖像的結(jié)構(gòu)信息,同時(shí)模糊了“噪聲”。

np.roll()函數(shù)可以循環(huán)滾動(dòng)元素,np.linalg.norm()用于衡量?jī)蓚€(gè)數(shù)組間的差異。

之后有空將補(bǔ)充圖像去噪

參考書籍
Python計(jì)算機(jī)視覺


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日本大学生免费一级一片 | 欧美精品午夜论理电影 | 精品欧美一区二区三区免费观看 | va在线播放 | 91成人在线免费 | 在线视频不卡国产在线视频不卡 | 久久精品视频5 | 四虎伊人| 国产乱妇无码大黄AA片 | 99热久久这里只有精品首页 | AV国産精品毛片一区二区三区 | 亚洲欧美日韩中文字幕久久 | 国产精品国产三级在线专区 | 成人一区二区三区四区 | 国产成人精品999在线观看 | 色综合婷婷 | 久久99国产精品成人欧美 | 天天操国产| 日韩五码在线 | 全黄裸片武则天一级第4季 亚洲一区国产 | 精品69久久久久久99 | 欧美一区二区三区四区夜夜大片 | 台湾一级毛片永久免费 | 91高清在线观看 | 国内久久精品 | 亚洲宗合 | 全黄裸片武则天一级第4季 亚洲一区国产 | 国产性夜夜性夜夜爽91 | 亚洲jizzjizz妇女 | 91茄子国产线观看免费 | 91免费电影 | 奇米奇米777 | 久久精品视在线看1 | 亚洲欧美综合网 | 国产中文字幕在线观看 | 国产精品第三页在线看 | 亚洲资源在线播放 | 欧美精品黄页在线观看大全 | 人人看人人干 | 日韩中文在线视频 | 99视频观看 |