KNN均值滤波、KNN中值滤波和均方差滤波

第一次写博客,平时老师留的一些作业,虽然很简单,但也是想保存一下,留个纪念吧。
我对KNN均值滤波的理解,选取某一像素点,取其中心M*M内的像素值,根据模值去前K个像素,求其平均,这K个像素包含中心点。KNN中值是取前K个值的中值。可能理解有错误,滤波后的结果不是很理想。
之前一直觉得自己动手能力很弱,恰好这次作业也不难,就拿python试了试,也算小小的克服了对字典的恐惧。下附python代码,和网上找的matlab代码。

import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
def KNNfliter(str,M,K):
    img = cv2.imread(str,0).astype(np.float32)
    matrix = np.asarray(img)
    size = img.shape
    mid=(M-1)//2
    value=0.0
    #dic=np.arange(M*M+1)
    for i in range(mid,size[0]-mid):
        for j in range(mid,size[1]-mid):
            order = matrix[i-mid:i+mid+1,j-mid:j+mid+1]
            order=order.flatten()
            order=order-matrix[i][j]
            order1=abs(order)
            dict1=dict(zip(order,order1))
            a=sorted(dict1.items(),key = lambda kv:(kv[1],kv[0]))
            for s in range(K):
                value=value+a[s][0]
            value=value+K*matrix[i][j]
            matrix[i,j]=round(value/K)
    image = Image.fromarray(matrix)
    return image
def KNNMfliter(str,M,K):
    img = cv2.imread(str,0).astype(np.float32)
    matrix = np.asarray(img)
    size = img.shape
    mid=(M-1)//2
    value=0.0
    for i in range(mid,size[0]-mid):
        for j in range(mid,size[1]-mid):
            order = matrix[i-mid:i+mid+1,j-mid:j+mid+1]
            order=order.flatten()
            order = order - matrix[i][j]
            order1 = abs(order)
            dict1 = dict(zip(order, order1))
            a = sorted(dict1.items(), key=lambda kv: (kv[1], kv[0]))
            matrix[i,j]=matrix[i][j]+value[(k-1)/2]
    image = Image.fromarray(matrix)
    return image
img='gaus.jpg'
image=cv2.imread(img,0)
image1=KNNfliter(img,5,3)
image2=KNNMfliter(img,5,3)
plt.imshow(image1)
plt.imshow(image2)
plt.show()
#KNNMF
function[ J ]=knnmf(I)
[l,w]=size(I);
M=5;K=9;
MM=M*M;
weighMM=ceil(M/2);
lweighMM=fix(M/2);
lhalfMM=fix(M*M/2);
uhalfMM=ceil(M*M/2);
iend=l-weighMM;
jend=w-weighMM;
J=I;
for i=weighMM:iend
    for j=weighMM:jend
        I1=I(i-weighMM+1:i+weighMM-1,j-weighMM+1:j+weighMM-1);
        A=reshape(I1,1,MM);
        intA=int16(A);
        for k=1:MM
            B(1,k)=int16(intA(uhalfMM)-intA(k));
        end
        BB=abs(B);
        [BBB,id]=sort(BB);
        for k=1:K;
            C(1,k)=A(id(k));
        end
        J(i,j)=round(median(C));
    end
end
end
#KNNF
function[ J ]=K_neardealnoise(I)
[l,w]=size(I);
M=5;K=9;
MM=M*M;
weighMM=ceil(M/2);
lweighMM=fix(M/2);
lhalfMM=fix(M*M/2);
uhalfMM=ceil(M*M/2);
iend=l-weighMM;
jend=w-weighMM;
J=I;
for i=weighMM:iend
    for j=weighMM:jend
        I1=I(i-weighMM+1:i+weighMM-1,j-weighMM+1:j+weighMM-1);
        A=reshape(I1,1,MM);
        intA=int16(A);
        for k=1:MM
            B(1,k)=int16(intA(uhalfMM)-intA(k));
        end
        BB=abs(B);
        [BBB,id]=sort(BB);
        for k=1:K;
            C(1,k)=A(id(k));
        end
        J(i,j)=round(mean(C));
    end
end
end
#均方滤波
function[y]=grayminvariance(x)
[m,n]=size(x);
x=double(x);
y=x;
for i=3:m-2
    for j=3:n-2
    z1=[x(i-1,j+2),x(i,j+2),x(i+1,j+2),x(i-1,j+1),x(i,j+1),x(i+1,j+1),x(i,j)];
    z2=[x(i-1,j-1),x(i,j-1),x(i+1,j-1),x(i-1,j-2),x(i,j-2),x(i+1,j-2),x(i,j)];
    z3=[x(i-2,j+1),x(i-1,j+1),x(i-2,j),x(i-1,j),x(i-2,j-1),x(i-1,j-1),x(i,j)];
    z4=[x(i+1,j+1),x(i+2,j+1),x(i+1,j),x(i+2,j),x(i+1,j-1),x(i+2,j-1),x(i,j)];
    z5=[x(i-2,j+2),x(i-1,j+2),x(i-2,j+1),x(i-1,j+1),x(i,j+1),x(i-1,j),x(i,j)];
    z6=[x(i+1,j+2),x(i+2,j+2),x(i,j+1),x(i+1,j+1),x(i+2,j+1),x(i+1,j),x(i,j)];
    z7=[x(i-1,j),x(i-2,j-1),x(i-1,j-1),x(i,j-1),x(i-2,j-2),x(i-1,j-2),x(i,j)];
    z8=[x(i+1,j),x(i,j-1),x(i+1,j-1),x(i+2,j-1),x(i+1,j-2),x(i+2,j-2),x(i,j)];
    z9=[x(i-1,j+1),x(i,j+1),x(i+1,j+1),x(i-1,j-1),x(i,j-1),x(i+1,j-1),x(i-1,j),x(i,j),x(i+1,j)];
    z=[z1,z2,z3,z4,z5,z6,z7,z8,z9];
    h=[var(z1),var(z2),var(z3),var(z4),var(z5),var(z6),var(z7),var(z8),var(z9)];
    %9个方差进行冒泡排序法
        for i1=1:1:8
            for j1=1:1:9-i1
                if h(1,j1) > h(1,j1+1)
                    z0=z(1,j1);%z0为临时变量
                    z(1,j1)=z(1,j1+1);
                    z(1,j1+1)=z0;
                end
            end
        end
    %最小方差已经求出,即h(1,1),对应z(1,1)这个向量,即对应的方差最小的模板
    y(i,j)=mean( z(1,1) );%中心像素获得最小方差模板对应的均值
    %y(i,j)=median( z(1,1) );%中心像素获得最小方差模板对应的中值
    end
end
发布了2 篇原创文章 · 获赞 0 · 访问量 40

猜你喜欢

转载自blog.csdn.net/comea23/article/details/104825888