중앙값 필터(Median Filter)란? AI에서 주변값의 순서로 이미지의 튀는 잡음을 줄이는 방법
TL;DR
중앙값 필터는 주변 픽셀값을 작은 순서로 놓고 가운데에 오는 값으로 중심 픽셀을 바꾸는 영상 처리 방법입니다. 평균처럼 큰 잡음값을 그대로 더하지 않아 소금·후추 모양의 충격성 잡음을 줄일 때 검토합니다. 창 크기와 모양, 영상 밖의 값 처리에 따라 결과가 달라집니다. 작은 점이나 가는 글자도 지울 수 있으므로 원본과 후속 AI 인식 결과를 따로 확인합니다.
핵심 3줄 요약
- 핵심 1
평균 대신 값의 순서를 봅니다. 홀수 개 이웃의 가운데 값을 고릅니다. 중심과 가장 비슷한 값을 찾는 계산은 아닙니다. - 핵심 2
창과 경계가 결과를 바꿉니다. 같은 크기라도 이웃의 모양·채널 축·영상 밖 채움 방식이 다르면 출력이 달라집니다. - 핵심 3
작은 신호도 함께 없어집니다. 밝은 점이 잡음인지 결함인지 필터는 모릅니다. 무처리 영상과 실제 업무 오류를 함께 비교합니다.
이 글에서 다룰 내용
- 중앙값 필터의 한 문장 정의
- 아홉 픽셀로 보는 중앙값과 평균의 차이
- AI 전처리의 사용 이유와 계산 순서
- OpenCV·SciPy·scikit-image의 설정과 경계 처리
- 가우시안·양방향 필터·형태학적 연산과의 구분
- 문서·제품 이미지의 실전 체크리스트
- 작은 신호·채널 축·짝수 이웃에서 주의할 점
중앙값 필터를 한 문장으로 정의하면 무엇인가요?
중앙값 필터는 정한 이웃 안의 밝기값을 순서대로 비교해 중앙 순위의 값으로 현재 픽셀을 대체하는 비선형 평활 필터입니다.
영문명은 Median Filter이며 중간값 필터, 미디언 필터라고도 부릅니다. 여기서 중앙은 영상의 가운데 좌표가 아니라 값의 순서에서 가운데를 뜻합니다. 가장 자주 나온 값을 고르는 최빈값 계산이나 최솟값·최댓값을 고르는 계산과도 구분합니다.
홀수 개 값을 쓰는 기본 설명에서는 작은 순서로 놓았을 때 양옆에 같은 수의 값이 남는 하나를 고릅니다. OpenCV 공식 평활 필터 안내는 이웃 영역의 중앙값으로 중심을 바꾸는 원리를 설명합니다. 신경망 가중치를 배우는 단계 없이 정한 규칙으로 영상을 처리합니다.
한 줄 정리: 무엇을 평균낼지 가중치를 정하는 대신, 주변값에서 가운데 순위 하나를 고릅니다. 그 점이 실제 잡음인지 판단하는 의미 인식은 없습니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 3×3 회색조 구역을 본다고 가정해 보겠습니다. 가운데 픽셀만 255이고 나머지 여덟 픽셀은 모두 10입니다. 이 아홉 값을 작은 순서로 놓으면 10이 여덟 번 나온 뒤 255가 나옵니다.
다섯 번째 값인 10이 중앙값입니다. 따라서 가운데 255는 10으로 바뀝니다. 같은 아홉 값을 모두 더해 나누는 산술평균은 약 37.22입니다. 하나의 매우 밝은 점이 평균을 끌어올리지만 중앙 순위는 바꾸지 못하는 예시입니다.
반대로 검은 바탕의 가는 흰 세로선이 3×3 구역을 지난다면 흰 255는 세 개, 검은 0은 여섯 개입니다. 이 구역의 중앙값은 0이므로 선의 가운데도 검게 바뀝니다. 작은 흰 점을 지우는 성질이 필요한 문자 획이나 결함을 지우는 원인이 되기도 합니다.
이 수치들은 Python 표준 라이브러리로 고정된 배열을 정렬하고 평균을 계산해 확인한 설명용 결과입니다. OpenCV·SciPy·scikit-image를 실제 호출한 영상 처리 결과는 아닙니다. 이웃 안의 값 비교를 설명하며 전체 사진의 경계 처리나 구현 속도를 재현했다고 주장하지 않습니다.
쉬운 예시: 혼자 튀는 값이 가운데 순위에 영향을 주지 않으면 사라집니다. 필요한 가는 선도 주변에서 소수이면 같은 방식으로 없어집니다.
왜 AI에서 중앙값 필터가 중요한가요?
충격성 잡음의 영향을 따로 비교합니다
OpenCV 공식 안내는 소금·후추 잡음에 중앙값 처리를 소개합니다. 어둡거나 밝은 점이 드문드문 튀는 입력에서 전처리 후보로 검토합니다. 센서의 모든 잡음, 압축 얼룩이나 흐림이 같은 조건은 아니므로 잡음 유형부터 나누어 봅니다.
전처리의 이익과 정보 손실을 함께 봅니다
문서 인식에서는 작은 점을 줄인 결과와 가는 획을 잃은 결과가 함께 나타날 수 있습니다. 제품 검사에서는 점 잡음처럼 보이는 흔적이 실제 결함일 수도 있습니다. 처리 전후 확대 영상과 정답이 있는 후속 인식 결과를 함께 비교하면 화면의 깔끔함만으로 전처리를 선택하는 실수를 줄입니다.
핵심 인사이트: 필터는 값의 순서를 계산합니다. 무엇을 남겨야 하는지는 업무의 정답과 사람이 정한 검수 기준에서 결정합니다.
중앙값 필터는 어떤 순서로 작동하나요?
1. 중심과 이웃의 모양을 정합니다
기본적인 3×3 정사각형 창은 중심을 포함한 아홉 위치를 사용합니다. 원반이나 십자처럼 선택한 위치만 쓰는 방식도 있습니다. 창의 가로 길이, 실제 포함한 값의 수와 처리할 축을 따로 기록합니다. 같은 바깥 크기의 창도 일부 위치를 빼면 순위를 계산하는 자료가 달라집니다.
2. 값의 순위에서 가운데를 고릅니다
이웃값을 작은 순서로 비교해 중앙 순위의 값을 출력합니다. 설명에서는 정렬을 쓰지만 실제 구현이 항상 전체 정렬을 그대로 수행한다는 뜻은 아닙니다. 홀수 이웃의 기본 규칙에는 평균을 내거나 중심과의 색 차이 가중치를 곱하는 단계가 없습니다.
3. 중심을 옮겨 새 영상을 만듭니다
각 위치에서 같은 규칙으로 출력값을 구합니다. 계산 원리를 이해할 때는 원본 이웃에서 결과를 구해 새 배열에 쓰는 방식으로 보면 됩니다. 직접 반복문을 만들면서 이미 바꾼 왼쪽 결과를 다음 창의 입력으로 섞으면 다른 연산이 됩니다. 여러 번 필터를 적용하는 실험도 한 번의 출력과 구분합니다.
실전 팁: 창 크기만 기록하지 말고 이웃 모양·처리 축·경계 방식과 반복 횟수도 남기세요. 같은 이름의 필터 사이에서 결과가 다른 이유를 찾기 쉽습니다.
주요 설정과 결과는 어떻게 읽나요?
OpenCV는 창 크기와 지원 자료형을 함께 봅니다
OpenCV medianBlur 공식 API의
ksize
는 정사각형 창의 한 변 길이이며 홀수이고 1보다 커야 합니다. 예를 들어 3은 3×3 창을 뜻합니다. 출력은 입력과 같은 크기·자료형이고 여러 채널은 각각 독립적으로 처리합니다.
확인한 OpenCV 4.13.0 문서는 1·3·4채널 입력을 안내합니다. 창 크기가 3이나 5이면 8비트 부호 없는 정수, 16비트 부호 없는 정수와 32비트 실수를 지원하지만 더 큰 창은 8비트 부호 없는 정수로 제한합니다. 실수 배열을 큰 창에 그대로 넣어도 된다고 일반화하지 않습니다. 경계에는
BORDER_REPLICATE
를 내부적으로 사용합니다.
SciPy는 이웃과 처리 축을 명시합니다
SciPy ndimage.median_filter 공식 API의
size
는 축별 창 크기이고
footprint
는 실제로 포함할 위치를 나타내는 배열입니다. footprint를 주면 size는 무시합니다.
axes=None
이면 모든 축을 처리하므로 높이·너비·색상으로 된 배열에서 채널 축까지 공간 이웃처럼 섞지 않는지 확인합니다.
짝수 개 이웃은 통계 교과서의 중앙 두 값 평균과 다를 수 있습니다. 이 함수는 정렬된 값의
n // 2
인덱스를 고릅니다.
[1,2,100,101]
에서는 100이며 일반적인 두 중앙값의 평균 51과 다릅니다. 문서는 NaN이 있을 때 동작이 정의되지 않는다고 명시하므로 결측값을 자동으로 무시한다고 가정하지 않습니다.
같은 크기라도 영상 가장자리 결과는 다릅니다
SciPy ndimage의 기본은
mode="reflect"
입니다. SciPy signal.medfilt2d 공식 API는 2차원 배열에 홀수 창을 쓰고 영상 밖을 0으로 채웁니다. scikit-image filters.median 공식 API는 기본
mode="nearest"
이며
behavior="ndimage"
에서 SciPy의 ndimage 함수를 사용합니다. 이름만 보고 기본 경계가 같다고 판단하지 않습니다.
모든 값이 10인 충분히 큰 영상의 모서리에 3×3 창을 놓으면, 밖을 0으로 채울 때 아홉 위치 중 다섯 개가 0이어서 중앙값도 0입니다. 끝값을 복제하면 모두 10이어서 10이 나옵니다. 앞의 값 정렬과 같은 표준 라이브러리 설명용 계산이며 실제 함수 호출 결과로 보고하지 않습니다.
중앙값 필터와 헷갈리는 용어는 무엇이 다른가요?
가우시안·양방향 필터와의 차이
가우시안 필터는 위치 거리에 따른 가중평균입니다. 양방향 필터는 중심과의 밝기·색 차이도 가중치에 반영합니다. 중앙값 필터는 이웃값의 순위를 봅니다. 평균 계열의 두 sigma를 중앙값 창 크기로 그대로 바꾸거나 같은 강도라고 비교하지 않습니다.
형태학적 연산·최빈값 필터와의 차이
형태학적 연산의 평탄한 회색조 침식·팽창은 이웃의 최솟값·최댓값을 사용하는 방식입니다. 중앙값은 가운데 순위를 고릅니다. 범주 번호에서 가장 자주 나온 라벨을 고르는 최빈값 필터도 별개입니다. 라벨 번호의 크기 순서에 의미가 없다면 중앙값 처리를 그대로 쓰지 않습니다.
히스토그램 평활화·이진화와의 차이
히스토그램 평활화는 누적 밝기 분포로 대비를 재배치하고, 이진화는 기준에 따라 픽셀을 두 값으로 나눕니다. 중앙값 필터는 위치별 주변값을 사용해 여전히 밝기 영상을 만듭니다. 잡음이 줄었다고 자동으로 물체의 이름이나 영역 번호가 붙지는 않습니다.
비교 정리: 중앙값은 이웃의 순위 선택, 양방향 필터는 선택적 가중평균, 형태학적 침식·팽창은 극값 선택입니다. 출력과 필요한 신호를 기준으로 구분합니다.
실전에서는 어디에 쓰이나요?
문서 인식 전의 점 잡음을 비교합니다
스캔 문서의 점 잡음을 줄이는 후보로 두고 무처리 영상과 비교합니다. 마침표·소수점·한글의 작은 획도 중요한 신호이므로 큰 글자만 보지 않습니다. 점을 줄인 영상에서 글자 오류와 누락이 실제로 줄었는지 별도 문서로 확인합니다.
제품 영상의 작은 흔적을 검수합니다
배경에 고립된 이상 픽셀이 있을 때 전처리 후보를 비교합니다. 작은 찍힘이나 표면 점이 검출 대상이면 필터가 정답을 지울 수 있습니다. 검사에 필요한 최소 크기를 먼저 정하고 원본·처리 영상·검출 결과를 한 묶음으로 남깁니다.
중앙값 필터를 적용할 때 어떤 순서로 확인하나요?
1. 입력과 지킬 신호를 고정합니다
같은 해상도·잘라낸 영역·자료형·색상 규칙을 사용합니다. 회색조와 색상 배열을 나누고 축 순서를 기록합니다. 없애려는 점 잡음과 지켜야 할 작은 획·결함을 각각 표시합니다. 원본은 보관하며 비교 중에 덮어쓰지 않습니다.
2. 작은 창과 실패 예시부터 확인합니다
한 점이 튀는 구역, 가는 선, 밝기가 일정한 구역과 영상 모서리를 시험합니다. 창 크기를 하나씩 바꾸고 경계·채널 처리는 고정합니다. 정사각형과 다른 footprint를 비교한다면 포함한 위치 수도 기록해 모양의 효과와 자료 수의 효과를 섞지 않습니다.
3. 후속 오류와 실제 실행 비용을 기록합니다
설정을 고른 자료와 최종 평가 자료를 분리해 OCR 오류·결함 누락·오탐을 확인합니다. 학습 입력과 운영 입력의 전처리 규칙도 맞춥니다. 더 큰 창이 언제나 더 좋은 결과나 같은 속도를 뜻하지 않으므로 실제 해상도와 장치에서 처리 시간·메모리를 확인합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 작은 점을 모두 잡음으로 보지 않습니다. 필요한 점과 획이 이웃에서 소수이면 함께 사라집니다. 원래의 센서값을 측정할 작업이라면 바뀐 밝기로 원본을 대신하지 말고 표시용 보정과 정량 측정을 구분합니다.
둘째, 창을 키우면 세부 손실도 다시 봅니다. 잡음이 서로 뭉쳐 창의 상당 부분을 차지하면 중앙값도 잡음 쪽으로 바뀔 수 있습니다. 한 점 예시의 성공을 큰 오염 영역이나 모든 종류의 잡음 제거 성능으로 확대하지 않습니다.
셋째, 색상·채널 축을 명시합니다. 채널별 중앙값은 각 성분을 따로 고르므로 결과 색 벡터가 원래 한 픽셀의 색과 같다는 보장은 없습니다. 반대로 다차원 기본값으로 채널을 함께 처리하면 의도하지 않은 값 섞임이 생길 수 있습니다. 색 번짐과 색 변화도 확대해 확인합니다.
넷째, 결측값·짝수 이웃·가장자리를 별도로 검사합니다. NaN 처리와 짝수 이웃의 순위 규칙은 구현에 따라 확인합니다. 기본 경계만 바뀌어도 모서리의 밝기가 달라지므로 중앙 구역의 성공만으로 전체 영상을 검증하지 않습니다. 반복 처리한 횟수도 결과와 함께 남깁니다.
주의: 중앙값 처리는 원래 장면의 완전 복원이나 AI 정확도 향상을 보장하지 않습니다. 보기 좋은 출력보다 필요한 신호의 보존과 실제 인식 오류를 판단 기준으로 삼습니다.
자주 묻는 질문
Q1. 중앙값 필터는 평균 필터와 같은가요?
아닙니다. 홀수 이웃의 중앙값은 값의 순서에서 가운데 하나를 고릅니다. 산술평균은 모든 값을 더해 나눕니다. 하나의 매우 큰 값이 두 계산에 미치는 영향이 다릅니다.
Q2. 소금·후추 잡음은 모두 없어지나요?
고립된 충격성 잡음에 유용한 후보이지만 잡음의 밀도와 창 크기에 따라 남을 수 있습니다. 필요한 작은 점도 지우므로 원본과 정답이 있는 평가 자료에서 확인합니다.
Q3. 창 크기는 반드시 홀수여야 하나요?
OpenCV medianBlur와 SciPy medfilt2d는 홀수 창을 요구합니다. SciPy ndimage는 짝수 이웃도 다루지만 중앙 두 값의 평균이 아닌 위쪽 중앙 순위의 값을 고르므로 같은 정의로 해석하지 않습니다.
Q4. RGB 영상에 같은 설정을 넣어도 되나요?
공간 이웃과 채널 축을 구분해야 합니다. OpenCV는 채널별로 처리하지만 SciPy ndimage의 기본은 모든 축을 대상으로 합니다. 채널별 순위 선택도 원래 색 조합의 완전 보존을 뜻하지 않습니다.
Q5. 점이 사라졌다면 인식도 좋아진 것인가요?
화면에서 사라진 점이 마침표나 작은 결함일 수도 있습니다. 같은 조건의 원본과 처리 영상에서 문자 오류·누락·오탐을 비교합니다. 필터 성공과 후속 업무 성공은 따로 기록합니다.
출처
마무리
중앙값 필터는 주변 밝기값의 순서에서 가운데를 골라 튀는 값을 줄이는 영상 처리 방법입니다. 가중평균과의 차이, 창·footprint·축과 경계 규칙을 구분하면 같은 이름의 함수가 다른 결과를 내는 이유를 이해하기 쉽습니다.
처음 적용한다면 한 점 잡음과 가는 선, 일정한 밝기의 모서리를 함께 비교해 보세요. 원본과 출력, 창 설정과 경계 조건을 남기고 작은 신호와 색 변화, 후속 인식 오류를 따로 확인합니다. 더 깔끔한 화면보다 실제 업무에서 필요한 정보가 남았는지가 선택 기준입니다.
