成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

圖像處理?沒有Python可不行

JaysonWang / 1459人閱讀

摘要:如果為灰度圖像則沒有通道。也可以使用的形式,表示第二行,第三列,紅色通道。對數(shù)調(diào)整用一行兩列來展示圖像另一個很有用的圖像增強(qiáng)算法是直方圖均衡化,能有效的改善圖像。膨脹處理可以擴(kuò)充邊緣和填充空洞。

python作為簡單高效又很強(qiáng)大的一門編程語言,對于圖像的處理自然也是輕松拿下,scikit-image是python中處理圖像的一個庫,對大多數(shù)的圖像處理算法進(jìn)行了封裝,用戶只需調(diào)用相關(guān)的接口即可。

入門示例

首先使用pip安裝skimage

pip install skimage

我們都知道,圖像是由像素構(gòu)成的,其中彩色圖像還包括不同的通道,視頻則是在圖像的基礎(chǔ)上加入時間變量而已。一張圖就像是由像素點(diǎn)構(gòu)成的表格一樣,skimage正是基于此來進(jìn)行圖像的處理操作。具體來說,skimage使用numpy作為圖像的數(shù)據(jù)類型,numpy不用多說,它可以讓你在 Python 中使用向量和數(shù)學(xué)矩陣(有不了解的可以網(wǎng)上找找教程)。

我們首先來打開一張圖片看看。

為了方便,我們使用skimage自帶的一些圖片,這些圖片放在data模塊下,使用data.導(dǎo)入即可。如果要打開本地文件夾下的圖片,可以使用io模塊下的imread方法,保存圖片可以使用io.imsave。

from skimage import data, io
img = data.chelsea()
# 查看圖片,使用io模塊中的imshow方法
io.imshow(img)
# 保存圖片
io.imsave("F:cat.jpg", img)

接下來進(jìn)行一些簡單的圖像處理。

一張圖片在skimage中表示為多維數(shù)組的形式,比如img[2:16, 1:10, 0]表示寬度上從第2個像素點(diǎn)到第16個像素點(diǎn),高度上從1到10的像素點(diǎn),紅色通道。如果為灰度圖像則沒有通道。也可以使用img[2, 3, 0]的形式,表示第二行,第三列,紅色通道。

使用.shape顯示圖片的信息。如果圖片為彩色圖片,顯示為寬度像素值,高度像素值,通道。

print(img.shape)
(300, 451, 3)

我們可以只顯示圖片的某一個通道,其中紅綠藍(lán)三個通道分別用數(shù)字0,1,2表示。比如只顯示紅色通道:

R = img[:, :, 0]
io.imshow(R)

我們也可以通過只顯示某部分像素區(qū)間來剪裁圖像,比如:

img_c = img[80:180, 100:200, :]
io.imshow(img_c)

還可以通過控制像素把圖像二值化,也就是把像素值轉(zhuǎn)換為0,1的形式。

from skimage import color
img4 = data.chelsea()
# 將彩色圖像轉(zhuǎn)為灰度圖像,用到color模塊
img_gray = color.rgb2gray(img4)

# 拆包獲得行列數(shù)
rows, cols = img_gray.shape

# 循環(huán),如果像素值小于0.5為0,反之則為1。
for i in range(rows):
    for j in range(cols):
        if img_gray[i, j]<=0.5:
            img_gray[i, j] = 0
        else:
            img_gray[i, j] = 1
io.imshow(img_gray)

圖像增強(qiáng)

作為圖像處理的一個部分,圖像增強(qiáng)用來改善圖像的圖像的質(zhì)量,也就是讓圖片更好看。skimage提供了強(qiáng)大的函數(shù)支持。

比如通過灰度變換改變圖片的對比度和亮度。常見的算法有伽馬調(diào)整和和log對數(shù)調(diào)整,在此不深究具體的算法細(xì)節(jié),會用即可。

這里使用到matplotlib包,這是python中的一個繪圖工具,用來展示圖像,繪制統(tǒng)計圖等。

from skimage import exposure, img_as_float
import matplotlib.pyplot as plt

# 把圖像的像素值轉(zhuǎn)換為浮點(diǎn)數(shù)
imge5 = img_as_float(data.moon())

# 使用伽馬調(diào)整
# 第二個參數(shù)控制亮度,大于1增強(qiáng)亮度,小于1降低。
gam1 = exposure.adjust_gamma(imge5, 2)


# 對數(shù)調(diào)整
log1 = exposure.adjust_log(imge5, 0.7)


# 用一行兩列來展示圖像
plt.subplot(1, 3, 1)
plt.imshow(imge5, plt.cm.gray)

plt.subplot(1, 3, 2)
plt.imshow(gam1, plt.cm.gray)

plt.subplot(1, 3, 3)
plt.imshow(log1, plt.cm.gray)

另一個很有用的圖像增強(qiáng)算法是直方圖均衡化,能有效的改善圖像。直方圖均衡化簡單來說就是通過將直方圖變?yōu)榫鶆蚍植嫉膩砀纳茖Ρ榷?。直方圖的橫坐標(biāo)代表某個像素,縱坐標(biāo)代表該像素有多少個。

# 直方圖均衡化
import matplotlib.pyplot as plt

img6 = data.moon()
# 指定繪制的大小
plt.figure("hist", figsize=(8, 8))

# 把圖像的二維數(shù)組按行轉(zhuǎn)為一維數(shù)組,這樣才能繪制直方圖
arr = img6.flatten()

plt.subplot(2,2,1)
plt.imshow(img6, plt.cm.gray)
plt.subplot(2,2,2)
# 繪制直方圖
plt.hist(arr, bins=256, normed=1, edgecolor="None",facecolor="red")

# 對直方圖進(jìn)行均衡化
img_c = exposure.equalize_hist(img6)
arr_c = img_c.flatten()
plt.subplot(2,2,3)
plt.imshow(img_c, plt.cm.gray)
plt.subplot(2,2,4)
plt.hist(arr_c, bins=256, normed=1, edgecolor="None", facecolor="red")

plt.show()

可以明顯的看出,經(jīng)過直方圖均衡化之后,圖像質(zhì)量改善了許多。

再一個圖像增強(qiáng)中常用的算法就是各種濾波器,像平滑化濾波器,銳化濾波器等。這其中,平滑濾波器可以用來去除噪聲和平滑化處理圖像,具體使用到的濾波器為低通濾波和中值濾波。不過低通噪聲去除噪聲的同時也平滑化了邊和尖銳的細(xì)節(jié),中值濾波則不會。

除了低通還有高通,除了中值還有最大值,最小值,均值等濾波器,在此不多贅述,查官方手冊即可。

濾波器相關(guān)的算法放在filter模塊下,記得導(dǎo)入。

from skimage import filters
import skimage.morphology as sm
image6 = data.camera()
# 中值濾波
# 第二個參數(shù)代表濾波器的形狀,disk代表平面圓形,當(dāng)然還有什么正方形,矩形啥的
edges = filters.median(image6, sm.disk(5))

plt.subplot(1, 2, 1)
plt.imshow(image6, plt.cm.gray)

plt.subplot(1, 2, 2)
plt.imshow(edges, plt.cm.gray)

與平滑濾波器正好相反,銳化濾波器可以用來提取邊緣,凸顯某些標(biāo)志,突出細(xì)節(jié)等。其中的算法包括各種算子,roberts算子,prewitt梯度算子等等,還有微分濾波器等。

比如使用sobel描述圖像中物體的邊緣。

img = color.rgb2gray(data.chelsea())
# 使用sobel算子
edges = filters.sobel(img)

plt.figure("img", figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.title("sobel")
plt.imshow(edges, plt.cm.gray)
plt.show()

圖像分割

圖像分割主要就是進(jìn)行特征提取,從而使別圖像中的物體,比如給你一張滿是蘋果的照片,讓你統(tǒng)計照片中一共有多少個蘋果。數(shù)出來的可不算。這時候就要用到圖像分割中的一些算法了。

介紹下閾值分割。閾值是什么意思,比如你有一堆蘋果,為了區(qū)分出哪些是好蘋果哪些是不好的,規(guī)定尺寸大于75的就是好的,這里的75就是閾值。簡單來說,閾值分割就是利用圖像中要提取的目標(biāo)區(qū)域與其背景在灰度特性上的差異,把圖像看作具有不同灰度級的兩類區(qū)域(目標(biāo)區(qū)域和背景區(qū)域)的組合,選取一個比較合理的閾值,產(chǎn)生二值圖像。

看個例子。

img = color.rgb2gray(data.chelsea())
# 基于otsu閥值分割方法
thresh = filters.threshold_otsu(img)
dst = (img<=thresh)*1.0

plt.figure("img", figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.title("otsu")
plt.imshow(dst, plt.cm.gray)
plt.show()

再說下形態(tài)學(xué)變換,形態(tài)學(xué)變換包括膨脹處理,腐蝕處理,開閉運(yùn)算,白黑帽等。膨脹處理的意思是說檢測圖像中像素值為1的點(diǎn),然后將它周圍某個區(qū)域的像素都變?yōu)?。膨脹處理可以擴(kuò)充邊緣和填充空洞。

看個例子。

img = data.checkerboard()
# 設(shè)置結(jié)構(gòu)元素為邊長5的正方形
dst = sm.dilation(img, sm.square(5))
plt.figure("dilation", figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.imshow(dst, plt.cm.gray)

腐蝕處理正好相反,檢測圖像中像素值為0的點(diǎn),然后將它周圍某個區(qū)域的像素都變?yōu)?。

img = data.checkerboard()
# 設(shè)置結(jié)構(gòu)元素為邊長5的正方形
dst = sm.erosion(img, sm.square(5))
plt.figure("dilation", figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img, plt.cm.gray)
plt.subplot(1,2,2)
plt.imshow(dst, plt.cm.gray)

圖像識別

在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的推動下,圖像識別獲得了很大的發(fā)展,識別率節(jié)節(jié)攀升。如今的圖像識別都在用深度學(xué)習(xí)算法來進(jìn)行,所以這部分就不細(xì)講了。

skimage中有一些很有用的算法用來檢測輪廓。比如使用霍夫圓來檢測圓形,橢圓變換來檢測橢圓等等。

import numpy as np
import matplotlib.pyplot as plt
from skimage import data, color,draw,transform,feature,util

image = util.img_as_ubyte(data.coins()[0:95, 70:370]) #裁剪原圖片
edges =feature.canny(image, sigma=3, low_threshold=10, high_threshold=50) #檢測canny邊緣

fig, (ax0,ax1) = plt.subplots(1,2, figsize=(8, 5))

ax0.imshow(edges, cmap=plt.cm.gray)  #顯示canny邊緣
ax0.set_title("original iamge")

hough_radii = np.arange(15, 30, 2)  #半徑范圍
hough_res =transform.hough_circle(edges, hough_radii)  #圓變換 

centers = []  #保存中心點(diǎn)坐標(biāo)
accums = []   #累積值
radii = []    #半徑

for radius, h in zip(hough_radii, hough_res):
    #每一個半徑值,取出其中兩個圓
    num_peaks = 2
    peaks =feature.peak_local_max(h, num_peaks=num_peaks) #取出峰值
    centers.extend(peaks)
    accums.extend(h[peaks[:, 0], peaks[:, 1]])
    radii.extend([radius] * num_peaks)

#畫出最接近的5個圓
image = color.gray2rgb(image)
for idx in np.argsort(accums)[::-1][:5]:
    center_x, center_y = centers[idx]
    radius = radii[idx]
    cx, cy =draw.circle_perimeter(center_y, center_x, radius)
    image[cy, cx] = (255,0,0)

ax1.imshow(image)
ax1.set_title("detected image")

這篇文章大致介紹了使用skimage庫來進(jìn)行圖像處理的一些過程,各種算法的具體使用還是查看官方手冊最為妥當(dāng)。

本人才疏學(xué)淺,上文中難免有些錯誤,還請各位品評指正。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44500.html

相關(guān)文章

  • ??爆肝十二萬字《python從零到精通教程》,從零教你變大佬??(建議收藏)

    文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...

    booster 評論0 收藏0
  • Python將被加入高考科目?你怎么看?

    摘要:浙江省教育廳基教處相關(guān)負(fù)責(zé)人也表示,目前為止,還沒有接到下半年開始使用新教材的通知。人生苦短,趕緊用起吧,大潮來襲,還在等什么原文鏈接將被加入高考科目你怎么看原文鏈接開發(fā)者交流平臺,沒有辦法放鏈接為了不侵權(quán),把作者的公眾號聯(lián)系方式放在這里。 今天看到這樣的一則新聞:不禁感嘆,人工智能這股風(fēng)來的太快,已經(jīng)掀起全民學(xué)習(xí)Python的浪潮。 2017年中觀察:看上去這個大綱內(nèi)容基本是這樣了,...

    Yujiaao 評論0 收藏0
  • Python-數(shù)據(jù)類型總結(jié)

    摘要:如果有一個值為真,立刻返回該值如果所有的值都為假,返回最后一個假值注意在布爾上下文中會一直進(jìn)行表達(dá)式演算直到找到第一個真值,然后就會忽略剩余的比較值結(jié)合使用結(jié)合了前面的兩種語法,推理即可。 一、介紹 按存儲空間的占用分(從低到高):數(shù)字字符串集合:無序,即無序存索引相關(guān)信息元組:有序,需要存索引相關(guān)信息,不可變列表:有序,需要存索引相關(guān)信息,可變,需要處理數(shù)據(jù)的增刪改字典:無序,需要存...

    Miracle 評論0 收藏0
  • Python指令庫click的實際應(yīng)用

      一、序言  接下來要詳細(xì)介紹的click乃是以一種你也很熟識的方式去輕松玩cmd。cmd程序流程實質(zhì)上是界定主要參數(shù)與處理主要參數(shù),而解決參數(shù)邏輯性肯定是和所界定的主要參數(shù)相關(guān)聯(lián)的。那可不可以用函數(shù)公式和裝飾器來達(dá)到解決主要參數(shù)邏輯界定主要參數(shù)的聯(lián)系呢?而click正好便是以這樣的方式來所使用的?! ”鞠盗挟a(chǎn)品文章內(nèi)容默認(rèn)設(shè)置應(yīng)用Python3做為編譯器進(jìn)行介紹?! ∪羰悄阋廊辉趹?yīng)用Pytho...

    89542767 評論0 收藏0
  • Java Lambda 表達(dá)式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記

    摘要:表達(dá)式又名閉包匿名函數(shù)筆記根據(jù)終于在中引入了表達(dá)式。函數(shù)式接口要介紹中表達(dá)式的實現(xiàn),需要知道什么是函數(shù)式接口。但同樣需要保證外部的自由變量不能在表達(dá)式中被改變。 Java Lambda 表達(dá)式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記 根據(jù) JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達(dá)式。也稱之為閉包或者匿名函數(shù)。 showImg(https...

    fou7 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<