python 디지털 이미지 처리 골조 추출 및 분수령 알고리즘
1.골조 추출
골조 추출 은 2 치 이미지 세분 화 라 고도 한다.이 알고리즘 은 하나의 연결 구역 을 픽 셀 의 너비 로 세분 화하 여 특징 추출 과 목표 토폴로지 표시 에 사용 할 수 있다.
morphology 서브 모듈 은 골조 추출 에 사용 되 는 두 가지 함 수 를 제공 합 니 다.각각 Skeletonize()함수 와 medial 입 니 다.axis()함수.우선 Skeletonize()함 수 를 살 펴 보 겠 습 니 다.
형식:skimage.morphology.skeletonize(image)
입력 과 출력 은 모두 2 값 그림 입 니 다.
예 1:
from skimage import morphology,draw
import numpy as np
import matplotlib.pyplot as plt
#
image = np.zeros((400, 400))
# 1( U )
image[10:-10, 10:100] = 1
image[-100:-10, 10:-10] = 1
image[10:-10, -100:-10] = 1
# 2(X )
rs, cs = draw.line(250, 150, 10, 280)
for i in range(10):
image[rs + i, cs] = 1
rs, cs = draw.line(10, 150, 250, 280)
for i in range(20):
image[rs + i, cs] = 1
# 3(O )
ir, ic = np.indices(image.shape)
circle1 = (ic - 135)**2 + (ir - 150)**2 < 30**2
circle2 = (ic - 135)**2 + (ir - 150)**2 < 20**2
image[circle1] = 1
image[circle2] = 0
#
skeleton =morphology.skeletonize(image)
#
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
ax1.imshow(image, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('original', fontsize=20)
ax2.imshow(skeleton, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title('skeleton', fontsize=20)
fig.tight_layout()
plt.show()
테스트 이미 지 를 생 성 합 니 다.위 에 세 개의 목표 대상 이 있 는데 각각 골조 추출 을 한 결 과 는 다음 과 같 습 니 다.예 2:시스템 자체 의 말 사진 을 이용 하여 골조 추출
from skimage import morphology,data,color
import matplotlib.pyplot as plt
image=color.rgb2gray(data.horse())
image=1-image #
#
skeleton =morphology.skeletonize(image)
#
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
ax1.imshow(image, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('original', fontsize=20)
ax2.imshow(skeleton, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title('skeleton', fontsize=20)
fig.tight_layout()
plt.show()
medial_axis 는 중축 의 뜻 으로 중축 변환 방법 으로 전망(1 값)목표 대상 의 폭 을 계산 하고 형식 은 다음 과 같다.
skimage.morphology.medial_axis(image,mask=None,return_distance=False)
마스크:마스크.기본 값 은 None 입 니 다.마스크 를 지정 하면 마스크 안의 픽 셀 값 에서 골조 알고리즘 을 실행 합 니 다.
return_distance:bool 형 값 은 기본적으로 False 입 니 다.True 라면 골조 로 돌아 가 는 것 외 에 거리 변환 값 도 동시에 되 돌려 줍 니 다.이곳 의 거 리 는 중축 선의 모든 점 과 배경 점 의 거 리 를 가리킨다.
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=64) #
#
skel, distance =morphology.medial_axis(data, return_distance=True)
#
dist_on_skel = distance * skel
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
ax1.imshow(data, cmap=plt.cm.gray, interpolation='nearest')
#
ax2.imshow(dist_on_skel, cmap=plt.cm.spectral, interpolation='nearest')
ax2.contour(data, [0.5], colors='w') #
fig.tight_layout()
plt.show()
2.분수령 알고리즘
분수령 은 지리학 적 으로 하나의 산 등 성 이 를 말 하 는데 물 은 보통 산등성이 의 양쪽 을 따라 서로 다른'합류 대야'로 흐른다.분수령 알고리즘 은 이미지 분할 에 사용 되 는 전형 적 인 알고리즘 으로 토폴로지 이론 을 바탕 으로 하 는 수학 형태학 의 분할 방법 이다.그림 속 의 목표 물체 가 연결 되 어 있 으 면 분할 하기 가 더욱 어렵 고 분수령 알고리즘 은 이런 문 제 를 처리 하 는 데 자주 사용 되 며 비교적 좋 은 효 과 를 거 둘 수 있다.
분수령 알고리즘 은 거리 변환 과 결합 하여'환수 분지'와'분수령 경계'를 찾 아 이미 지 를 분할 할 수 있다.2 값 그림 의 거리 변환 은 모든 픽 셀 점 에서 가장 가 까 운 0 값 픽 셀 점 까지 의 거리 입 니 다.우 리 는 scipy 패 키 지 를 사용 하여 거리 변환 을 계산 할 수 있 습 니 다.
아래 의 예 에서 두 개의 겹 치 는 원 을 분리 해 야 한다.우 리 는 먼저 원 에 있 는 이 흰색 픽 셀 점 에서 검은색 배경 픽 셀 점 까지 의 거리 변 화 를 계산 하고 거리 변환 중의 최대 치 를 초기 표지 점(반 색 이 라면 최소 치)으로 선택 합 니 다.이 표지 점 에서 시 작 된 두 개의 합류 대야 가 집 중 될 수록 마지막 으로 분 산 령 과 교차 합 니 다.분수령 에서 끊 어 지면 우 리 는 두 개의 분 리 된 원 을 얻 게 된다.
예 1:거리 변환 에 기반 한 분수령 이미지 분할
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage import morphology,feature
#
x, y = np.indices((80, 80))
x1, y1, x2, y2 = 28, 28, 44, 52
r1, r2 = 16, 20
mask_circle1 = (x - x1)**2 + (y - y1)**2 < r1**2
mask_circle2 = (x - x2)**2 + (y - y2)**2 < r2**2
image = np.logical_or(mask_circle1, mask_circle2)
#
distance = ndi.distance_transform_edt(image) #
local_maxi =feature.peak_local_max(distance, indices=False, footprint=np.ones((3, 3)),
labels=image) #
markers = ndi.label(local_maxi)[0] #
labels =morphology.watershed(-distance, markers, mask=image) #
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))
axes = axes.ravel()
ax0, ax1, ax2, ax3 = axes
ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')
ax0.set_title("Original")
ax1.imshow(-distance, cmap=plt.cm.jet, interpolation='nearest')
ax1.set_title("Distance")
ax2.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')
ax2.set_title("Markers")
ax3.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest')
ax3.set_title("Segmented")
for ax in axes:
ax.axis('off')
fig.tight_layout()
plt.show()
분수령 알고리즘 도 경사도 와 결합 하여 이미지 분할 을 실현 할 수 있다.일반적인 경사도 이미 지 는 가장자리 에 비교적 높 은 픽 셀 값 이 있 고 다른 곳 에 서 는 비교적 낮은 픽 셀 값 이 있 으 며 이상 적 인 상황 에서 분 산 령 은 마침 가장자리 에 있다.그래서 우 리 는 경사도 에 따라 분 산 령 을 찾 을 수 있다.
예 2:경사도 기반 분수령 이미지 분할
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage import morphology,color,data,filter
image =color.rgb2gray(data.camera())
denoised = filter.rank.median(image, morphology.disk(2)) #
# 10
markers = filter.rank.gradient(denoised, morphology.disk(5)) <10
markers = ndi.label(markers)[0]
gradient = filter.rank.gradient(denoised, morphology.disk(2)) #
labels =morphology.watershed(gradient, markers, mask=image) #
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(6, 6))
axes = axes.ravel()
ax0, ax1, ax2, ax3 = axes
ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')
ax0.set_title("Original")
ax1.imshow(gradient, cmap=plt.cm.spectral, interpolation='nearest')
ax1.set_title("Gradient")
ax2.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')
ax2.set_title("Markers")
ax3.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest')
ax3.set_title("Segmented")
for ax in axes:
ax.axis('off')
fig.tight_layout()
plt.show()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.