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

8061 단어 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()

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기