python-opencv 중간 값 필터{cv2.medianBlur(src,ksize)}의 용법
중간 값 필 터 는 그림 의 모든 픽 셀 을 인접 도 메 인(현재 픽 셀 중심의 정사각형 영역)픽 셀 의 중간 값 으로 대체 합 니 다.이웃 평균 법 과 유사 하지만 중간 값 으로 계산 된다.
#
for y in xrange(1,myh-1):
for x in xrange(1,myw-1):
lbimg[y,x]=np.median(tmpimg[y-1:y+2,x-1:x+2]
다음은 opencv 함수 호출
# -*- coding: utf-8 -*-
#code:[email protected]
#
import cv2
import numpy as np
fn="test3.jpg"
myimg=cv2.imread(fn)
img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)
#
#
w=img.shape[1]
h=img.shape[0]
newimg=np.array(img)
#
noisecount=50000
for k in xrange(0,noisecount):
xi=int(np.random.uniform(0,newimg.shape[1]))
xj=int(np.random.uniform(0,newimg.shape[0]))
newimg[xj,xi]=255
#
lbimg=cv2.medianBlur(newimg,3)
cv2.imshow('src',newimg)
cv2.imshow('dst',lbimg)
cv2.waitKey()
cv2.destroyAllWindows()
중간 값 필 터 는 높 은 단계 의 그 레이스 케 일과 낮은 단계 의 그 레이스 케 일 을 무시 하고 중간 값 을 직접 취하 기 때문에 캡 사이 신 소음 을 효과적으로 걸 러 낼 수 있다.가우스 잡음 필터
scipy.signal 중간 값 필터 사용 하기
중간 값 필터 기술 은 소음 을 효과적으로 억제 할 수 있 으 며,디지털 이미지 의 한 점 의 값 을 이 점 주위 의 각 점 값 의 중위 값 으로 대체 하여 이러한 값 을 접근 시 켜 원래 이미지 의 소음 을 없 앨 수 있다.
*아 날로 그 중간 값 필터
>>> import random
>>> import numpy as np
>>> import scipy.signal as signal
>>> x=np.arange(0,100,10)
>>> random.shuffle(x)
>>> x
array([70, 80, 30, 20, 10, 90, 0, 60, 40, 50])
>>> signal.medfilt(x,3) #
array([ 70., 70., 30., 20., 20., 10., 60., 40., 50., 40.])
signal 의 medfilt()방법 은 두 개의 매개 변 수 를 전달 합 니 다.첫 번 째 매개 변 수 는 중간 값 필터 의 신호 이 고 두 번 째 매개 변 수 는 인접 지역 의 크기(홀수)입 니 다.예 를 들 어 이웃 이 3 이면 모든 점 이 자신 과 좌우 각 점 이 하나의 이웃 이 되 는 것 이다.각 위치의 인접 도 메 인 에서 중위 수 를 선택 하여 이 위 치 를 교체 하 는 수,즉 이 함수 의 반환 값 배열 입 니 다.인접 지역 에 원소 가 없 는 위치 가 나타 나 면 0 으로 보완 합 니 다.
>>> x=np.random.randint(1,1000,(4,4))
>>> x
array([[ 31, 33, 745, 483],
[331, 469, 804, 479],
[235, 487, 244, 982],
[857, 114, 167, 174]])
>>> signal.medfilt(x,(3,3)) #
array([[ 0., 33., 469., 0.],
[ 33., 331., 483., 479.],
[ 235., 331., 469., 174.],
[ 0., 167., 167., 0.]])
2 차원 중간 값 필 터 는 signal.medfilt2d()를 사용 할 수 있 으 며 속도 가 빠 르 지만 int 8,float 32,float 64 만 지원 합 니 다.*그림 의 중간 값 필터(이 코드 는 아직 시도 하지 않 았 습 니 다.문제 가 생기 면 코드 의 문제 라 고 의심 할 수 있 습 니 다)
import numpy as np
from PIL import Image
import scipy.signal as signal
im=Image.open('test.jpg') # Image im
data=[] # list( )
width,height=im.size #
#
for h in range(height): # h
row=[] #
for w in range(width): # w
value=im.getpixel((h,w)) # getpixel
row.append(value)# list
data.append(row) # data list , list
data=signal.medfilt(data,kernel_size=3) #
data=np.int32(data) # int ,
#
for h in range(height): #
for w in range(width): #
im.putpixel((h,w),tuple(data[h][w])) # data , tuple
im.save('result.jpg')#
opencv 중간 값 필터 medianBlur중간 값 필 터 는 전형 적 인 비 선형 필터 로 정렬 통계 이론 을 바탕 으로 소음 을 효과적으로 억제 할 수 있 는 비 선형 신호 처리 기술 이다.기본 사상 은 픽 셀 점 인접 도 메 인 그 레이스 케 일 값 의 중간 값 으로 이 픽 셀 점 의 그 레이스 케 일 값 을 대체 하여 주변의 픽 셀 값 을 실제 값 에 가 깝 게 하여 고립 된 소음 점 을 없 애 는 것 이다.이 방법 은 펄스 소음,캡 사이 신 소음 을 추출 하 는 동시에 이미지 의 가장자리 디 테 일 을 유지 할 수 있다.이런 우수한 특성 은 선형 필터 가 갖 추 지 못 한 것 이다.
중간 값 필터 도 먼저 필터 템 플 릿 을 생 성 해 야 합 니 다.이 템 플 릿 안의 각 픽 셀 값 을 정렬 하여 단조 로 운 상승 또는 단조 로 운 하강 의 2 차원 데이터 시퀀스 를 생 성 합 니 다.2 차원 중간 값 필터 출력 은 g(x,y)=medf{f(x-k,y-1),(k,l*8712°w)}입 니 다.그 중에서 f(x,y)와 g(x,y)는 각각 원래 이미지 와 처리 후 이미지 이 고 w 는 입력 한 2 차원 템 플 릿 으로 전체 그림 에서 미 끄 러 질 수 있 습 니 다.보통 사 이 즈 는 3*3 또는 5*5 구역 이 고 선형,원형,십자 형,원형 등 서로 다른 모양 일 수도 있 습 니 다.그림 의 2 차원 템 플 릿 에서 홀수 데 이 터 를 꺼 내 정렬 하고 처리 할 데 이 터 를 정렬 한 중간 값 으로 대체 하면 됩 니 다.
중간 값 필 터 는 캡 사이 신 소음 을 없 애 는 데 매우 효과 적 이 고 선형 필터 가 가 져 온 이미지 디 테 일 모호 등 단점 을 극복 할 수 있 으 며 이미지 가장자리 정 보 를 효과적으로 보호 할 수 있 으 며 매우 전형 적 인 부 드 러 운 소음 처리 방법 이다.광학 측정 스 트 라 이 프 이미지 의 향기 분석 처리 방법 에 서 는 특수 한 역할 을 하지만 스 트 라 이 프 중심 분석 방법 에 서 는 큰 역할 을 하지 않 는 다.
중간 값 필 터 는 선형 필터 의 평균 값 필터 의 장점 에 비해 앞에서 언급 한 바 와 같이 좋 은 필터 효 과 를 거 두 는 대 가 는 시간 이 걸 리 는 것 이 고 평균 값 필터 의 몇 배 에 달 할 수 있 으 며 디 테 일이 많은 이미지 에 도 적용 되 지 않 습 니 다.
opencv 에서 medianBlur()함 수 를 제공 하여 중간 값 필터 작업 을 실 현 했 습 니 다.그 원형 은 다음 과 같 습 니 다.
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
매개 변수 설명:.InputArray src:그림 을 입력 하 십시오.그림 은 1,3,4 채널 의 그림 입 니 다.템 플 릿 크기 가 3 또는 5 일 때 그림 의 깊이 는 CV 일 수 있 습 니 다.8U、CV_16U、CV_32F 중의 하나,예 를 들 어 비교적 큰 구경 사이즈 의 그림 에 대해 이미지 깊이 는 CV 일 수 밖 에 없다.8U。
.Output Array dst:출력 이미지,크기 와 형식 이 입력 이미지 와 일치 합 니 다.Mat::Clone 을 사용 하여 원본 그림 을 템 플 릿 으로 출력 이미지 dst 를 초기 화 할 수 있 습 니 다.
.int ksize:필터 템 플 릿 의 크기 는 1 이상 의 홀수 여야 합 니 다.예 를 들 어 3,5,7...
예제 프로그램:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
//
Mat g_mSrcImage;
Mat g_mDstImage;
const int g_nMedianBlurMaxValue = 5;
int g_nMedianBlurValue;
int g_nkernelSize;
//
void on_medianBlurTrackBar(int, void*);
int main()
{
g_mSrcImage = imread("lena.jpg");
//
if(g_mSrcImage.empty())
{
cout << " !" << endl;
return -1;
}
else
cout << " !" << endl;
// CV_8U
if(0 <= g_mSrcImage.depth() <= 255)
cout << " !" << endl;
else
{
cout << " CV_8U, ..." << endl;
return -1;
}
namedWindow(" ", WINDOW_AUTOSIZE);
imshow(" ", g_mSrcImage);
//
namedWindow(" ", WINDOW_AUTOSIZE);
char medianBlurName[20];
sprintf(medianBlurName, " %d", g_nMedianBlurMaxValue);
g_nMedianBlurValue = 1;
//
createTrackbar(medianBlurName, " ", &g_nMedianBlurValue,
g_nMedianBlurMaxValue, on_medianBlurTrackBar);
on_medianBlurTrackBar(g_nMedianBlurValue, 0);
waitKey(0);
return 0;
}
void on_medianBlurTrackBar(int, void*)
{
// , 1
g_nkernelSize = g_nMedianBlurValue * 2 + 1;
medianBlur(g_mSrcImage, g_mDstImage, g_nkernelSize);
imshow(" ", g_mDstImage);
}
실행 결과:프로그램 설명:
프로그램 에서 이미지 깊이 에 대한 판단 은 다음 과 같은 기준 에 따른다.
CV_8U - 8-bit unsigned integers ( 0..255 )
CV_8S - 8-bit signed integers ( -128..127 )
CV_16U - 16-bit unsigned integers ( 0..65535 )
CV_16S - 16-bit signed integers ( -32768..32767 )
CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.