KNN平均値フィルタ、メディアンフィルタとKNN平均二乗フィルタリング

最初のブログは、教師のいくつかは、通常、非常に単純なものの、仕事にとどまるが、また、Liugejinianそれそれを保存します。
私は、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