>백엔드 개발 >파이썬 튜토리얼 >Python 디지털 이미지 처리의 고급 형태학적 처리

Python 디지털 이미지 처리의 고급 형태학적 처리

不言
不言원래의
2018-04-27 10:10:394279검색

이 글은 주로 Python 디지털 이미지 처리의 고급 형태학적 처리를 소개하고 있으며 참고용으로 제공합니다. 같이 살펴보시죠

형태학적 처리는 가장 기본적인 확장, 부식, 개폐 작업, 흑/백 햇 처리 외에 볼록 선체, 연결 영역 마킹, 삭제 등 좀 더 고급 응용도 있습니다. 작은 블록 면적 등

1. 볼록 껍질

볼록 껍질은 이미지의 흰색 픽셀을 모두 포함하는 볼록 다각형을 말합니다.

함수는 다음과 같습니다.

skimage.morphology.convex_hull_image(image)

입력은 이진 이미지이고 출력은 논리 이진 이미지입니다. 볼록 껍질 내의 점은 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(&#39;original image&#39;)

ax1.imshow(chull,plt.cm.gray)
ax1.set_title(&#39;convex_hull image&#39;)

convex_hull_image()는 그림의 모든 대상을 전체적으로 처리하므로 계산된 최소 볼록 다각형은 하나만 있습니다. 그림에 대상 객체가 여러 개 있고 각 객체가 최소 볼록 다각형을 계산해야 하는 경우, 볼록_hull_object() 함수를 사용해야 합니다.

함수 형식: skimage.morphology.convex_hull_object(image,neighbors=8)

입력 매개변수 이미지는 바이너리 이미지이며 이웃은 4 연결 또는 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(&#39;many objects&#39;)
ax1.imshow(chull,plt.cm.gray)
ax1.set_title(&#39;convex_hull image&#39;)
plt.show()

2. 연결 영역 표시

바이너리 이미지에서 두 픽셀이 인접하고 동일한 값(모두 0 또는 1)을 갖는 경우 다음과 같이 간주됩니다. 이 두 픽셀은 연결된 영역에 있습니다. 동일한 연결 영역의 모든 픽셀은 동일한 값으로 표시됩니다. 이 프로세스를 연결 영역 표시라고 합니다. 두 픽셀이 인접해 있는지 판단할 때 일반적으로 4연결 또는 8연결 판단을 사용합니다. 이미지에서 가장 작은 단위는 픽셀이고 각 픽셀은 8개의 인접한 픽셀로 둘러싸여 있습니다. 4개 인접 관계와 8개 인접 관계라는 두 가지 일반적인 인접 관계가 있습니다. 4는 아래 왼쪽 그림과 같이 상하좌우 총 4개 점에 인접해 있습니다. 8 아래 오른쪽 그림과 같이 대각선 위치의 점을 포함하여 총 8개의 인접점이 있습니다.

skimage 패키지에서는 측정 하위 모듈 아래의 label() 함수를 사용하여 연결된 영역 라벨링을 구현합니다.

함수 형식:

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

매개변수의 이미지는 처리해야 하는 바이너리 이미지를 나타내고 연결성은 연결 모드를 나타내고 1은 4개의 인접성을 나타내고 2는 8개의 인접성을 나타냅니다.

0부터 시작하는 라벨(라벨)의 배열을 출력합니다.

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

#编写一个函数来生成原始二值图像
def microstructure(l=256):
  n = 5
  x, y = np.ogrid[0:l, 0:l] #生成网络
  mask = np.zeros((l, l))
  generator = np.random.RandomState(1) #随机数种子
  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连通区域标记
dst=color.label2rgb(labels) #根据不同的标记显示不同的颜色
print(&#39;regions number:&#39;,labels.max()+1) #显示连通区域块数(从0开始标记)

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

fig.tight_layout()
plt.show()

코드에서 일부 위치에 1을 곱하면 bool 배열이 int 배열로 빠르게 변환될 수 있습니다.

결과는 그림과 같습니다. 0~9로 표시된 10개의 연결된 영역이 있습니다

면적 계산, 외접 직사각형, 볼록 선체 영역 등과 같이 연결된 각 영역을 별도로 작업하려는 경우 ., 측정 서브모듈의 Regionprops() 함수를 호출해야 합니다. 이 함수의 형식은 다음과 같습니다.

skimage.measure.regionprops(label_image)

연결된 모든 블록의 속성 목록을 반환합니다. 일반적으로 사용되는 속성 목록은 다음과 같습니다.


속성 이름 Type Description
area int 영역의 총 픽셀 수
bbox tuple bounding 경계 상자(min_row, min_col, max_row, max_col)
centroid array  중심좌표
convex_area int 볼록 껍질의 총 픽셀 수
convex_image ndarray 경계 상자와 크기가 같은 볼록 껍질
coords ndarray 영역의 픽셀 좌표
Eccentricity float eccentricity
equivalent_diameter float 영역과 면적이 같은 원의 지름
euler_number int  지역 오일러 수
extent float area sum 경계 상자 영역의 비율
filled_area int 영역과 경계 상자 사이에 채워지는 총 픽셀 수
경계 float 지역 경계
label int 지역 마커

3、删除小块区域

有些时候,我们只需要一些大块区域,那些零散的、小块的区域,我们就需要删除掉,则可以使用morphology子模块的remove_small_objects()函数。

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

参数:

ar: 待操作的bool型数组。

min_size: 最小连通区域尺寸,小于该尺寸的都将被删除。默认为64.

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

in_place: bool型值,如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False.

返回删除了小块区域的二值图像。

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

#编写一个函数来生成原始二值图像
def microstructure(l=256):
  n = 5
  x, y = np.ogrid[0:l, 0:l] #生成网络
  mask = np.zeros((l, l))
  generator = np.random.RandomState(1) #随机数种子
  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=&#39;nearest&#39;)
ax2.imshow(dst,plt.cm.gray,interpolation=&#39;nearest&#39;)

fig.tight_layout()
plt.show()

在此例中,我们将面积小于300的小块区域删除(由1变为0),结果如下图:

4、综合示例:阈值分割+闭运算+连通区域标记+删除小区块+分色显示

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() #复制
segmentation.clear_border(cleared) #清除与边界相连的目标物

label_image =measure.label(cleared) #连通区域标记
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): #循环得到每一个连通区域属性集
  
  #忽略小区域
  if region.area < 100:
    continue

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


위 내용은 Python 디지털 이미지 처리의 고급 형태학적 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.