最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python數(shù)字圖像處理之高級形態(tài)學(xué)處理

 更新時間:2018年04月27日 09:30:34   作者:denny402  
這篇文章主要介紹了python數(shù)字圖像處理之高級形態(tài)學(xué)處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

形態(tài)學(xué)處理,除了最基本的膨脹、腐蝕、開/閉運算、黑/白帽處理外,還有一些更高級的運用,如凸包,連通區(qū)域標記,刪除小塊區(qū)域等。

1、凸包

凸包是指一個凸多邊形,這個凸多邊形將圖片中所有的白色像素點都包含在內(nèi)。

函數(shù)為:

skimage.morphology.convex_hull_image(image)

輸入為二值圖像,輸出一個邏輯二值圖像。在凸包內(nèi)的點為True, 否則為False

例:

import matplotlib.pyplot as plt
from skimage import data,color,morphology

#生成二值測試圖像
img=color.rgb2gray(data.horse())
img=(img<0.5)*1

chull = morphology.convex_hull_image(img)

#繪制輪廓
fig, axes = plt.subplots(1,2,figsize=(8,8))
ax0, ax1= axes.ravel()
ax0.imshow(img,plt.cm.gray)
ax0.set_title('original image')

ax1.imshow(chull,plt.cm.gray)
ax1.set_title('convex_hull image')

convex_hull_image()是將圖片中的所有目標看作一個整體,因此計算出來只有一個最小凸多邊形。如果圖中有多個目標物體,每一個物體需要計算一個最小凸多邊形,則需要使用convex_hull_object()函數(shù)。

函數(shù)格式:skimage.morphology.convex_hull_object(image,neighbors=8)

輸入?yún)?shù)image是一個二值圖像,neighbors表示是采用4連通還是8連通,默認為8連通。

例:

import matplotlib.pyplot as plt
from skimage import data,color,morphology,feature

#生成二值測試圖像
img=color.rgb2gray(data.coins())
#檢測canny邊緣,得到二值圖片
edgs=feature.canny(img, sigma=3, low_threshold=10, high_threshold=50) 

chull = morphology.convex_hull_object(edgs)

#繪制輪廓
fig, axes = plt.subplots(1,2,figsize=(8,8))
ax0, ax1= axes.ravel()
ax0.imshow(edgs,plt.cm.gray)
ax0.set_title('many objects')
ax1.imshow(chull,plt.cm.gray)
ax1.set_title('convex_hull image')
plt.show()

2、連通區(qū)域標記

在二值圖像中,如果兩個像素點相鄰且值相同(同為0或同為1),那么就認為這兩個像素點在一個相互連通的區(qū)域內(nèi)。而同一個連通區(qū)域的所有像素點,都用同一個數(shù)值來進行標記,這個過程就叫連通區(qū)域標記。在判斷兩個像素是否相鄰時,我們通常采用4連通或8連通判斷。在圖像中,最小的單位是像素,每個像素周圍有8個鄰接像素,常見的鄰接關(guān)系有2種:4鄰接與8鄰接。4鄰接一共4個點,即上下左右,如下左圖所示。8鄰接的點一共有8個,包括了對角線位置的點,如下右圖所示。

在skimage包中,我們采用measure子模塊下的label()函數(shù)來實現(xiàn)連通區(qū)域標記。

函數(shù)格式:

skimage.measure.label(image,connectivity=None)

參數(shù)中的image表示需要處理的二值圖像,connectivity表示連接的模式,1代表4鄰接,2代表8鄰接。

輸出一個標記數(shù)組(labels), 從0開始標記。

import numpy as np
import scipy.ndimage as ndi
from skimage import measure,color
import matplotlib.pyplot as plt

#編寫一個函數(shù)來生成原始二值圖像
def microstructure(l=256):
  n = 5
  x, y = np.ogrid[0:l, 0:l] #生成網(wǎng)絡(luò)
  mask = np.zeros((l, l))
  generator = np.random.RandomState(1) #隨機數(shù)種子
  points = l * generator.rand(2, n**2)
  mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
  mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯濾波
  return mask > mask.mean()

data = microstructure(l=128)*1 #生成測試圖片

labels=measure.label(data,connectivity=2) #8連通區(qū)域標記
dst=color.label2rgb(labels) #根據(jù)不同的標記顯示不同的顏色
print('regions number:',labels.max()+1) #顯示連通區(qū)域塊數(shù)(從0開始標記)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
ax1.imshow(data, plt.cm.gray, interpolation='nearest')
ax1.axis('off')
ax2.imshow(dst,interpolation='nearest')
ax2.axis('off')

fig.tight_layout()
plt.show()

在代碼中,有些地方乘以1,則可以將bool數(shù)組快速地轉(zhuǎn)換為int數(shù)組。

結(jié)果如圖:有10個連通的區(qū)域,標記為0-9

如果想分別對每一個連通區(qū)域進行操作,比如計算面積、外接矩形、凸包面積等,則需要調(diào)用measure子模塊的regionprops()函數(shù)。該函數(shù)格式為:

skimage.measure.regionprops(label_image)

返回所有連通區(qū)塊的屬性列表,常用的屬性列表如下表:

屬性名稱 類型 描述
area int 區(qū)域內(nèi)像素點總數(shù)
bbox tuple 邊界外接框(min_row, min_col, max_row, max_col)
centroid array   質(zhì)心坐標
convex_area int 凸包內(nèi)像素點總數(shù)
convex_image ndarray 和邊界外接框同大小的凸包  
coords ndarray 區(qū)域內(nèi)像素點坐標
Eccentricity  float 離心率
equivalent_diameter  float 和區(qū)域面積相同的圓的直徑
euler_number int   區(qū)域歐拉數(shù)
extent  float 區(qū)域面積和邊界外接框面積的比率
filled_area int 區(qū)域和外接框之間填充的像素點總數(shù)
perimeter  float 區(qū)域周長
label int 區(qū)域標記

3、刪除小塊區(qū)域

有些時候,我們只需要一些大塊區(qū)域,那些零散的、小塊的區(qū)域,我們就需要刪除掉,則可以使用morphology子模塊的remove_small_objects()函數(shù)。

函數(shù)格式:skimage.morphology.remove_small_objects(ar,min_size=64,connectivity=1,in_place=False)

參數(shù):

ar: 待操作的bool型數(shù)組。

min_size: 最小連通區(qū)域尺寸,小于該尺寸的都將被刪除。默認為64.

connectivity: 鄰接模式,1表示4鄰接,2表示8鄰接

in_place: bool型值,如果為True,表示直接在輸入圖像中刪除小塊區(qū)域,否則進行復(fù)制后再刪除。默認為False.

返回刪除了小塊區(qū)域的二值圖像。

import numpy as np
import scipy.ndimage as ndi
from skimage import morphology
import matplotlib.pyplot as plt

#編寫一個函數(shù)來生成原始二值圖像
def microstructure(l=256):
  n = 5
  x, y = np.ogrid[0:l, 0:l] #生成網(wǎng)絡(luò)
  mask = np.zeros((l, l))
  generator = np.random.RandomState(1) #隨機數(shù)種子
  points = l * generator.rand(2, n**2)
  mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
  mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯濾波
  return mask > mask.mean()

data = microstructure(l=128) #生成測試圖片

dst=morphology.remove_small_objects(data,min_size=300,connectivity=1)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
ax1.imshow(data, plt.cm.gray, interpolation='nearest')
ax2.imshow(dst,plt.cm.gray,interpolation='nearest')

fig.tight_layout()
plt.show()

在此例中,我們將面積小于300的小塊區(qū)域刪除(由1變?yōu)?),結(jié)果如下圖:

4、綜合示例:閾值分割+閉運算+連通區(qū)域標記+刪除小區(qū)塊+分色顯示

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from skimage import data,filter,segmentation,measure,morphology,color

#加載并裁剪硬幣圖片
image = data.coins()[50:-50, 50:-50]

thresh =filter.threshold_otsu(image) #閾值分割
bw =morphology.closing(image > thresh, morphology.square(3)) #閉運算

cleared = bw.copy() #復(fù)制
segmentation.clear_border(cleared) #清除與邊界相連的目標物

label_image =measure.label(cleared) #連通區(qū)域標記
borders = np.logical_xor(bw, cleared) #異或
label_image[borders] = -1
image_label_overlay =color.label2rgb(label_image, image=image) #不同標記用不同顏色顯示

fig,(ax0,ax1)= plt.subplots(1,2, figsize=(8, 6))
ax0.imshow(cleared,plt.cm.gray)
ax1.imshow(image_label_overlay)

for region in measure.regionprops(label_image): #循環(huán)得到每一個連通區(qū)域?qū)傩约?
  
  #忽略小區(qū)域
  if region.area < 100:
    continue

  #繪制外包矩形
  minr, minc, maxr, maxc = region.bbox
  rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
               fill=False, edgecolor='red', linewidth=2)
  ax1.add_patch(rect)
fig.tight_layout()
plt.show()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實現(xiàn)udp聊天窗口

    python實現(xiàn)udp聊天窗口

    這篇文章主要為大家詳細介紹了python實現(xiàn)udp聊天窗口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python實現(xiàn)批量提取Excel數(shù)據(jù)

    Python實現(xiàn)批量提取Excel數(shù)據(jù)

    在數(shù)據(jù)處理和分析的過程中,Excel 是一種廣泛使用的數(shù)據(jù)存儲格式,本文將詳細介紹如何使用 pandas、openpyxl 和 xlrd 三種庫來批量提取 Excel 數(shù)據(jù),并提供相應(yīng)的示例代碼,需要的可以參考下
    2024-12-12
  • 基于Python編寫一個二維碼生成器

    基于Python編寫一個二維碼生成器

    二維碼又稱二維條碼,常見的二維碼為QR Code,QR全稱Quick Response,是一個近幾年來移動設(shè)備上超流行的一種編碼方式。本文將利用python生成一個簡單的二維碼生成器,需要的可以參考一下
    2022-06-06
  • Python Numpy中數(shù)組的集合操作詳解

    Python Numpy中數(shù)組的集合操作詳解

    這篇文章主要為大家詳細介紹了Python Numpy中數(shù)組的一些集合操作方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-08-08
  • Python中eval函數(shù)的表達式作用示例

    Python中eval函數(shù)的表達式作用示例

    這篇文章主要介紹了Python中eval函數(shù)的表達式用法示例,文中通過示例對比來為大家進行詳細的講解,有需要的朋友可以借鑒參下,希望有所幫助
    2021-09-09
  • Python和OpenCV自制訪客識別程序

    Python和OpenCV自制訪客識別程序

    這篇文章主要為大家詳細介紹了如何使用Python和OpenCV自制訪客識別程序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Python更改pip鏡像源的方法示例

    Python更改pip鏡像源的方法示例

    這篇文章主要介紹了Python更改pip鏡像源的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python Numpy庫常見用法入門教程

    Python Numpy庫常見用法入門教程

    這篇文章主要介紹了Python Numpy庫常見用法,結(jié)合實例形式詳細Fenix了Python numpy庫基本功能、原理以及數(shù)組常見操作技巧,需要的朋友可以參考下
    2020-01-01
  • Python生成任意波形并存為txt的實現(xiàn)

    Python生成任意波形并存為txt的實現(xiàn)

    本文主要介紹了Python生成任意波形并存為txt的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python畫圖常見不同圖片格式保存方式

    python畫圖常見不同圖片格式保存方式

    這篇文章主要介紹了python畫圖常見不同圖片格式保存方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

会同县| 平度市| 日照市| 寿光市| 沛县| 南陵县| 平江县| 临桂县| 改则县| 武宣县| 井陉县| 交口县| 晋城| 信宜市| 罗源县| 江油市| 唐山市| 涡阳县| 深泽县| 靖州| 阳江市| 澄迈县| 东港市| 太原市| 陵川县| 廉江市| 蓝山县| 天全县| 射洪县| 邯郸市| 元谋县| 衡山县| 南丹县| 大渡口区| 光泽县| 伊金霍洛旗| 馆陶县| 泰顺县| 平和县| 额尔古纳市| 酒泉市|