python 디지털 이미지 처리 의 고급 형태학 처리
1.볼록 가방
볼록 패 키 지 는 볼록 다각형 을 말 하 는데 이 볼록 다각형 은 그림 의 모든 흰색 픽 셀 점 을 포함한다.
함수:
skimage.morphology.convex_hull_image(image)
2 값 그림 으로 입력 하고 논리 2 값 그림 을 출력 합 니 다.볼록 가방 안의 점 은 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()함수.
함수 형식:skimage.morphology.convexhull_object(image,neighbors=8)
입력 매개 변수 image 는 2 값 그림 입 니 다.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.연결 영역 표시
2 값 그림 에서 두 픽 셀 점 이 서로 인접 하고 값 이 같 으 면(같은 0 또는 같은 1)이 두 픽 셀 점 이 서로 연 결 된 영역 에 있다 고 생각 합 니 다.같은 연결 구역 의 모든 픽 셀 점 은 같은 수치 로 표 시 됩 니 다.이 과정 을 연결 구역 표시 라 고 합 니 다.두 픽 셀 의 인접 여 부 를 판단 할 때 우 리 는 보통 4 연 통 또는 8 연 통 으로 판단 한다.그림 에서 가장 작은 단 위 는 픽 셀 이 고 모든 픽 셀 주위 에 8 개의 인접 픽 셀 이 있 으 며 흔히 볼 수 있 는 인접 관 계 는 2 가지 가 있 습 니 다.4 인접 과 8 인접 입 니 다.4.인접 점 은 모두 4 개의 점,즉 상하 좌우 로 다음 과 같은 왼쪽 그림 이다.8 인접 한 점 은 모두 8 개 로 대각선 위치의 점 을 포함 하고 아래 오른쪽 그림 과 같다.
skimage 패키지 에서 저 희 는 measure 서브 모듈 의 label()함 수 를 사용 하여 연결 영역 표 시 를 실현 합 니 다.
함수 형식:
skimage.measure.label(image,connectivity=None)
매개 변수 에 있 는 image 는 처리 해 야 할 2 값 그림 을 표시 하고 connectivity 는 연결 모드 를 표시 하 며 1 은 4 인접,2 는 8 인접 을 의미 합 니 다.태그 배열(labels)을 출력 하고 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('regions number:',labels.max()+1) # ( 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 배열 을 int 배열 로 빠르게 변환 할 수 있 습 니 다.결 과 는 그림 과 같다.10 개의 연 결 된 구역 이 있 고 0-9 로 표시 된다.
각 연결 구역 을 각각 조작 하려 면 면적,외 접 사각형,돌출 면적 등 을 계산 하려 면 measure 서브 모듈 의 regionprops()함 수 를 호출 해 야 합 니 다.이 함수 형식 은:
skimage.measure.regionprops(label_image)
모든 연결 블록 의 속성 목록 을 되 돌려 줍 니 다.자주 사용 하 는 속성 목록 은 다음 표 와 같 습 니 다.속성 이름
유형
묘사 하 다.
area
int
영역 내 픽 셀 점 총수
bbox
tuple
경계 외 접 상자(minrow, min_col, max_row, max_col)
centroid
array
질량 중심 좌표
convex_area
int
볼록 패키지 내 픽 셀 점 총수
convex_image
ndarray
경계 외 접 상자 와 같은 크기 의 볼록 가방
coords
ndarray
영역 내 픽 셀 점 좌표
Eccentricity
float
원심 율
equivalent_diameter
float
구역 면적 과 같은 원 의 지름.
euler_number
int
지역 오로라 수
extent
float
지역 면적 과 경계 외 접 틀 면적 의 비율
filled_area
int
영역 과 외 접 상자 사이 에 채 워 진 픽 셀 갯 수
perimeter
float
구역 둘레
label
int
영역 표시
3.작은 블록 영역 삭제
어떤 때 는 큰 구역 만 필요 합 니 다.흩 어 져 있 고 작은 구역 만 있 으 면 삭제 해 야 합 니 다.morphology 서브 모듈 의 remove 를 사용 할 수 있 습 니 다.small_objects()함수.
함수 형식:skimage.morphology.removesmall_objects(ar,min_size=64,connectivity=1,in_place=False)
인자:
a:작 동 할 bool 형 배열 입 니 다.
min_size:최소 연결 영역 크기,이 크기 보다 작은 것 은 삭 제 됩 니 다.기본 값 64.
connectivity:인접 모드,1 은 4 인접,2 는 8 인접
in_place:bool 형 값 은 True 라면 입력 이미지 에서 작은 블록 영역 을 직접 삭제 하고 그렇지 않 으 면 복사 한 후에 삭제 합 니 다.기본 값 은 false 입 니 다.
작은 블록 영역 을 삭제 한 2 값 그림 을 되 돌려 줍 니 다.
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='nearest')
ax2.imshow(dst,plt.cm.gray,interpolation='nearest')
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='red', linewidth=2)
ax1.add_patch(rect)
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에 따라 라이센스가 부여됩니다.