python-opencv 중간 값 필터{cv2.medianBlur(src,ksize)}의 용법

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 )
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기