摘要:如果為灰度圖像則沒有通道。也可以使用的形式,表示第二行,第三列,紅色通道。對數調整用一行兩列來展示圖像另一個很有用的圖像增強算法是直方圖均衡化,能有效的改善圖像。膨脹處理可以擴充邊緣和填充空洞。
python作為簡單高效又很強大的一門編程語言,對于圖像的處理自然也是輕松拿下,scikit-image是python中處理圖像的一個庫,對大多數的圖像處理算法進行了封裝,用戶只需調用相關的接口即可。
入門示例首先使用pip安裝skimage
pip install skimage
我們都知道,圖像是由像素構成的,其中彩色圖像還包括不同的通道,視頻則是在圖像的基礎上加入時間變量而已。一張圖就像是由像素點構成的表格一樣,skimage正是基于此來進行圖像的處理操作。具體來說,skimage使用numpy作為圖像的數據類型,numpy不用多說,它可以讓你在 Python 中使用向量和數學矩陣(有不了解的可以網上找找教程)。
我們首先來打開一張圖片看看。
為了方便,我們使用skimage自帶的一些圖片,這些圖片放在data模塊下,使用data.
from skimage import data, io img = data.chelsea() # 查看圖片,使用io模塊中的imshow方法 io.imshow(img) # 保存圖片 io.imsave("F:cat.jpg", img)
接下來進行一些簡單的圖像處理。
一張圖片在skimage中表示為多維數組的形式,比如img[2:16, 1:10, 0]表示寬度上從第2個像素點到第16個像素點,高度上從1到10的像素點,紅色通道。如果為灰度圖像則沒有通道。也可以使用img[2, 3, 0]的形式,表示第二行,第三列,紅色通道。
使用.shape顯示圖片的信息。如果圖片為彩色圖片,顯示為寬度像素值,高度像素值,通道。
print(img.shape)
(300, 451, 3)
我們可以只顯示圖片的某一個通道,其中紅綠藍三個通道分別用數字0,1,2表示。比如只顯示紅色通道:
R = img[:, :, 0] io.imshow(R)
我們也可以通過只顯示某部分像素區間來剪裁圖像,比如:
img_c = img[80:180, 100:200, :] io.imshow(img_c)
還可以通過控制像素把圖像二值化,也就是把像素值轉換為0,1的形式。
from skimage import color img4 = data.chelsea() # 將彩色圖像轉為灰度圖像,用到color模塊 img_gray = color.rgb2gray(img4) # 拆包獲得行列數 rows, cols = img_gray.shape # 循環,如果像素值小于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)圖像增強
作為圖像處理的一個部分,圖像增強用來改善圖像的圖像的質量,也就是讓圖片更好看。skimage提供了強大的函數支持。
比如通過灰度變換改變圖片的對比度和亮度。常見的算法有伽馬調整和和log對數調整,在此不深究具體的算法細節,會用即可。
這里使用到matplotlib包,這是python中的一個繪圖工具,用來展示圖像,繪制統計圖等。
from skimage import exposure, img_as_float import matplotlib.pyplot as plt # 把圖像的像素值轉換為浮點數 imge5 = img_as_float(data.moon()) # 使用伽馬調整 # 第二個參數控制亮度,大于1增強亮度,小于1降低。 gam1 = exposure.adjust_gamma(imge5, 2) # 對數調整 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)
另一個很有用的圖像增強算法是直方圖均衡化,能有效的改善圖像。直方圖均衡化簡單來說就是通過將直方圖變為均勻分布的來改善對比度。直方圖的橫坐標代表某個像素,縱坐標代表該像素有多少個。
# 直方圖均衡化 import matplotlib.pyplot as plt img6 = data.moon() # 指定繪制的大小 plt.figure("hist", figsize=(8, 8)) # 把圖像的二維數組按行轉為一維數組,這樣才能繪制直方圖 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") # 對直方圖進行均衡化 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()
可以明顯的看出,經過直方圖均衡化之后,圖像質量改善了許多。
再一個圖像增強中常用的算法就是各種濾波器,像平滑化濾波器,銳化濾波器等。這其中,平滑濾波器可以用來去除噪聲和平滑化處理圖像,具體使用到的濾波器為低通濾波和中值濾波。不過低通噪聲去除噪聲的同時也平滑化了邊和尖銳的細節,中值濾波則不會。
除了低通還有高通,除了中值還有最大值,最小值,均值等濾波器,在此不多贅述,查官方手冊即可。
濾波器相關的算法放在filter模塊下,記得導入。
from skimage import filters import skimage.morphology as sm image6 = data.camera() # 中值濾波 # 第二個參數代表濾波器的形狀,disk代表平面圓形,當然還有什么正方形,矩形啥的 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)
與平滑濾波器正好相反,銳化濾波器可以用來提取邊緣,凸顯某些標志,突出細節等。其中的算法包括各種算子,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()圖像分割
圖像分割主要就是進行特征提取,從而使別圖像中的物體,比如給你一張滿是蘋果的照片,讓你統計照片中一共有多少個蘋果。數出來的可不算。這時候就要用到圖像分割中的一些算法了。
介紹下閾值分割。閾值是什么意思,比如你有一堆蘋果,為了區分出哪些是好蘋果哪些是不好的,規定尺寸大于75的就是好的,這里的75就是閾值。簡單來說,閾值分割就是利用圖像中要提取的目標區域與其背景在灰度特性上的差異,把圖像看作具有不同灰度級的兩類區域(目標區域和背景區域)的組合,選取一個比較合理的閾值,產生二值圖像。
看個例子。
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()
再說下形態學變換,形態學變換包括膨脹處理,腐蝕處理,開閉運算,白黑帽等。膨脹處理的意思是說檢測圖像中像素值為1的點,然后將它周圍某個區域的像素都變為1。膨脹處理可以擴充邊緣和填充空洞。
看個例子。
img = data.checkerboard() # 設置結構元素為邊長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的點,然后將它周圍某個區域的像素都變為0。
img = data.checkerboard() # 設置結構元素為邊長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)圖像識別
在機器學習和深度學習的推動下,圖像識別獲得了很大的發展,識別率節節攀升。如今的圖像識別都在用深度學習算法來進行,所以這部分就不細講了。
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 = [] #保存中心點坐標 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庫來進行圖像處理的一些過程,各種算法的具體使用還是查看官方手冊最為妥當。
本人才疏學淺,上文中難免有些錯誤,還請各位品評指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44500.html
文章目錄 強烈推薦系列教程,建議學起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
摘要:浙江省教育廳基教處相關負責人也表示,目前為止,還沒有接到下半年開始使用新教材的通知。人生苦短,趕緊用起吧,大潮來襲,還在等什么原文鏈接將被加入高考科目你怎么看原文鏈接開發者交流平臺,沒有辦法放鏈接為了不侵權,把作者的公眾號聯系方式放在這里。 今天看到這樣的一則新聞:不禁感嘆,人工智能這股風來的太快,已經掀起全民學習Python的浪潮。 2017年中觀察:看上去這個大綱內容基本是這樣了,...
摘要:如果有一個值為真,立刻返回該值如果所有的值都為假,返回最后一個假值注意在布爾上下文中會一直進行表達式演算直到找到第一個真值,然后就會忽略剩余的比較值結合使用結合了前面的兩種語法,推理即可。 一、介紹 按存儲空間的占用分(從低到高):數字字符串集合:無序,即無序存索引相關信息元組:有序,需要存索引相關信息,不可變列表:有序,需要存索引相關信息,可變,需要處理數據的增刪改字典:無序,需要存...
一、序言 接下來要詳細介紹的click乃是以一種你也很熟識的方式去輕松玩cmd。cmd程序流程實質上是界定主要參數與處理主要參數,而解決參數邏輯性肯定是和所界定的主要參數相關聯的。那可不可以用函數公式和裝飾器來達到解決主要參數邏輯界定主要參數的聯系呢?而click正好便是以這樣的方式來所使用的。 本系列產品文章內容默認設置應用Python3做為編譯器進行介紹。 若是你依然在應用Pytho...
摘要:表達式又名閉包匿名函數筆記根據終于在中引入了表達式。函數式接口要介紹中表達式的實現,需要知道什么是函數式接口。但同樣需要保證外部的自由變量不能在表達式中被改變。 Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數 ) 筆記 根據 JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達式。也稱之為閉包或者匿名函數。 showImg(https...
閱讀 1324·2021-11-11 11:00
閱讀 3041·2021-09-24 09:47
閱讀 4950·2021-09-22 15:53
閱讀 960·2021-09-10 10:50
閱讀 3207·2021-09-01 11:40
閱讀 1160·2019-08-30 15:55
閱讀 473·2019-08-30 12:49
閱讀 1049·2019-08-29 17:12