第一次写博客,平时老师留的一些作业,虽然很简单,但也是想保存一下,留个纪念吧。
我对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