texture op• 데이터 종류: image → image
• 호출: fullseye.apply(img, "local_bimodality", a=0.5, b=0.5)(2-D 는 이미지 1 장 + 스칼라 노브 2 개 a,b∈[0,1] 모델)

*그림은 128×128 합성 입력에서 실제로 실행한 출력. 왼쪽이 입력, 오른쪽이 출력. 점군은 위에서 본 산점도(밝기 = z), 1-D 열은 꺾은선, 볼륨은 z 방향 최대값 투영, 동영상은 가운데 프레임, 복소 영상은 진폭이며, 그림이 되지 않는 반환값은 값 자체를 표시한다.*
노브 a 를 훑기(0.1 / 0.5 / 0.9, 다른 노브는 기본값):
▸ local_bimodality: 노브 a 스윕 (문서 사이트)
노브 b 를 훑기(0.1 / 0.5 / 0.9, 다른 노브는 기본값):
▸ local_bimodality: 노브 b 스윕 (문서 사이트)
다른 영상에서도(합성 장면 / 사진 / 동전. 윗줄이 입력, 아랫줄이 그 출력. 노브는 기본값):
▸ local_bimodality: 다른 입력 이미지 (문서 사이트)
*4열은 컬러 (H,W,3) 입력. 이 op는 채널을 넘나들지 않고 컬러를 다룰 수 있다(색 채널을 세 번째 공간축으로 컨볼루션하지 않음).*
국소 쌍봉성(bimodality coefficient). 임계값을 1개도 고르지 않고 '여기가 2개의 값으로 나뉘는가'만을 0~1 지도로 반환한다.
a가 창의 한 변의 길이를 9, 15, 25, 41로 바꾼다(클수록 추정은 안정되지만, 가는 구조는주위에 녹아든다). b가 대비의 바닥을 max(1e-5, 0.25b x 영상의 값 범위)로바꾼다 ―― 창의 표준편차가 이보다 작으면 0을 반환한다(b=0이어도 1e-5의 절대 바닥은 남는다).
BC = (왜도^2 + 1) / 첨도로, 창의 1〜4차 모멘트(상자형 평균 4회)만으로부터닫힌 식으로 나온다. 평행 이동에도 스케일에도 불변이므로, 옅은 무늬든 짙은 무늬든같은 값이 된다. 참조값은 해석해로 정해져 있으며, 실측도 거기로 수렴한다(창 41):
• 2점 분포(반반의 2값) = 1.0(첨도 1이 하한) ―― 계단 바로 위에서 실측 1.0000
• 균일 분포 = 5/9 = 0.5556 ―― 균일 난수로 실측 0.5598
• 정규 분포 = 1/3 = 0.3333 ―― 정규 난수로 실측 0.3306
> 5/9가 "균일보다 뾰족한 2개의 봉우리"의 고전적인 기준. ★단봉이어도 0이 되지는 않는다 ―― 정규 분포의 바닥은 1/3이지 0이 아니므로, 쓸 수 있는 것은 0.33〜1.0의 띠다.
출전과, 이어받고 있는 한계(Pfister, Schwarz, Janczyk, Dale & Freeman 2013, *Frontiers in Psychology* 4:700). ★치우친 단봉 분포가 위양성을 낸다: 논문의 그림에서는 명백히 단봉인 분포가 BC = 0.73, 정말로 쌍봉인 분포가 BC = 0.67로, 순위가역전되어 있다. 왜도가 절댓값으로 클수록 봉우리 수와 무관하게 BC가 올라가기 때문. 이 op도 같은 성질을 가진다 —— 한쪽으로 꼬리를 끄는 창(어두운 바탕에 밝은 점이 조금만 있는 등)은높게 나온다. 쌍봉성 판정을 이것 1개로 정하지 말고, local_std나 otsu의 분리도와 함께 볼 것. 또한 논문의 식은 표본 보정이 붙은 (m3^2+1)/(m4 + 3(n-1)^2/((n-2)(n-3)))이고, 이 op는 모집단판을 쓴다(창에는 81〜1,681 표본이 있어 보정은 무시할 수 있다. 위의 참조값 1/3, 5/9, 1.0은모집단판에서 엄밀히 성립한다).
임계값을 고르는 쪽의 일반화와의 관계: Barron (2020)의 Generalized Histogram Thresholding (arXiv:2007.07350)은 Otsu, Minimum Error Thresholding, 가중 백분위 임계값을특수한 경우로 포함하며, 어느 임계값으로 할지를 연속적으로 보간한다. 이 op는 짝이 되는 쪽으로, 애초에 임계값이 존재하는지를 측정한다.
왜 임계값을 고르는 op(otsu / threshold) 앞에 필요한가: 이진화는 어떤 영상에대해서도 답을 돌려주지만, 봉우리가 1개뿐인 창에서는 의미 없는 위치에서 자른다(otsu의 docstring이 스스로 인정하는 한계). 이 op는 자르기 전에 "애초에 나뉘는가"를돌려주므로, "나뉘지 않는 곳은 자르지 않는다"고 정할 수 있다. 문자 칸이 1색 바탕에 1색글자인지, 판이 균일하게 비춰지고 있는지, 흠집이 정말로 바탕과 다른 계조인지의 판정에 쓴다.
★바닥은 필수. 균일한 면에서는 분산이 반올림 부스러기가 되고, 부스러기끼리의 3차, 4차 비가 구조로둔갑한다 ―― 바닥을 영상의 값 범위에 대한 상대량만으로 둔 버전은, 0.5 단색에 진폭 1e-12〜1e-8 의 부스러기를 얹었을 뿐인 영상에서 BC의 최대가 1.0000이 되었다(값 범위 자체가 부스러기라서상대 바닥이 듣지 않는다). 절대 바닥 1e-5를 함께 두고서야 비로소 0으로 떨어진다(실측).
정규화하지 않으므로(값은 BC 그 자체), 영상 간에 비교할 수 있다. 가장자리는 반사(mode="reflect"). 빈 프레임은 전부 0. ★창이 넓으므로 타일 분할해서는 안 된다 (scale.py에 이유와 함께 등록되어 있음).
• gallery2d_texture_freq 패밀리 가이드
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
아래 프로그램은 실제로 실행됨을 확인했습니다(그림과 같은 입력). Studio 도움말에서는 이 블록이 버튼이 되어 즉시 불러와 실행할 수 있습니다.
local_bimodality 0.50 0.50
• gallery2d_texture_freq — py -3.11 examples/gallery2d_texture_freq.py
image 를 입력으로 받는 것)identity · gaussian · mean_box · bilateral · unsharp · median · min_filter · max_filter
texture)std_filter · local_std · scale_select_std · bootstrap_std_error · structure_tensor_orientation · structure_tensor_coherence · gabor · sk_frangi
*Provenance: ops.py — 2D 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.