摘要:如果為灰度圖像則沒有通道。也可以使用的形式,表示第二行,第三列,紅色通道。對數(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.
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
文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
摘要:浙江省教育廳基教處相關(guān)負(fù)責(zé)人也表示,目前為止,還沒有接到下半年開始使用新教材的通知。人生苦短,趕緊用起吧,大潮來襲,還在等什么原文鏈接將被加入高考科目你怎么看原文鏈接開發(fā)者交流平臺,沒有辦法放鏈接為了不侵權(quán),把作者的公眾號聯(lián)系方式放在這里。 今天看到這樣的一則新聞:不禁感嘆,人工智能這股風(fēng)來的太快,已經(jīng)掀起全民學(xué)習(xí)Python的浪潮。 2017年中觀察:看上去這個大綱內(nèi)容基本是這樣了,...
摘要:如果有一個值為真,立刻返回該值如果所有的值都為假,返回最后一個假值注意在布爾上下文中會一直進(jìn)行表達(dá)式演算直到找到第一個真值,然后就會忽略剩余的比較值結(jié)合使用結(jié)合了前面的兩種語法,推理即可。 一、介紹 按存儲空間的占用分(從低到高):數(shù)字字符串集合:無序,即無序存索引相關(guān)信息元組:有序,需要存索引相關(guān)信息,不可變列表:有序,需要存索引相關(guān)信息,可變,需要處理數(shù)據(jù)的增刪改字典:無序,需要存...
一、序言 接下來要詳細(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...
摘要:表達(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...
閱讀 1352·2021-11-11 11:00
閱讀 3120·2021-09-24 09:47
閱讀 5119·2021-09-22 15:53
閱讀 992·2021-09-10 10:50
閱讀 3235·2021-09-01 11:40
閱讀 1199·2019-08-30 15:55
閱讀 499·2019-08-30 12:49
閱讀 1086·2019-08-29 17:12