"""
项目内容:基于K-SVD学习的稀疏字典去噪
作者:忘川
时间:2019-03-11
"""
import ImageProcessing as IP
import math
import cv2
import random
from scipy import ndimage as nd
import copy
import numpy as np
from PIL import Image as im
"""
类说明:使用稀疏字典学习去噪
"""
class SparseClearNoise ():
"""
方法说明:初始化函数
参数说明:pic:无噪声图像
npic :有噪声图像
返回值:无
"""
def __init__ (self, pic,npic,samplek=1, sn=2):
self.img = copy.deepcopy (pic)
self.nimg = copy.deepcopy (npic)
self.w = npic.shape[1]
self.h = npic.shape[0]
self.sn = sn
self.nn = int((self.img.shape[1]-8)/self.sn) + 1
self.PicData = np.zeros((64,self.nn**2))
self.samplek = samplek
"""
方法说明:创建一个DCT字典
参数说明:bs:大小
r;冗余系数
返回值:DCT:构建好的DCT
"""
def CreatDCT (self, bs=8, r=4):
k = r*bs**2
hh = int (math.sqrt(k))
DCT = np.zeros((bs,hh))
for i in range(hh):
V = np.cos(np.array([j*i*math.pi/hh for j in range(bs)]))
if i > 0:
V = V - np.mean(V)
DCT[:,i] = V/np.linalg.norm(V)
DCT = np.kron(DCT,DCT)
## V = np.array([[math.sqrt(2/bs)*math.cos(k*i*math.pi/bs/2)\
## for k in range(16)] for i in range(bs)])
## V[:,0] = V[:,0]/math.sqrt(2)
## for i in range(1,V.shape[1]):
## V[:,i] -= sum(V[:,i].tolist())/V.shape[0]
## avr = np.linalg.norm(V[:,i])
## V[:,i] /= avr
## DCT = np.kron(V,V)
return DCT
"""
方法说明:以图像的形式显示一个字典
参数说明:DCT:被显示字典
ShowFlag:是否排序,只有学习后才使用排序
返回值:无
"""
def ShowDCT (self, DCT, ShowFlag=0):
a = []
D = copy.deepcopy(DCT)
#归一化
for i in range (D.shape[1]):
D[:,i] = D[:,i] - np.min(D[:,i])
if np.max(D[:,i]) != 0:
D[:,i] = D[:,i]/np.max(D[:,i])
if ShowFlag == 1:
P = np.var (D,axis=0)#列求平局值
for i in range (len (P)):
maxn = np.argmax(P)
a.extend([maxn])
P[maxn] = -P[maxn]
I = np.zeros((D.shape[0],D.shape[1]))
print (D)
for i in range(D.shape[1]):
I[:,i] = D[:,a[D.shape[1]-i-1]]
D = I
L = int(math.sqrt (DCT.shape[1]))
n = int(math.sqrt (DCT.shape[0]))
img_DCT = np.zeros((L*n,L*n))
for i in range(L):
for j in range(L):
for k in range (D.shape[0]):
img_DCT[i*8+int(k%8)][j*8+int(k/8)] = D[k][i*16+j]
img_DCT = img_DCT - np.min(D)
img_DCT = img_DCT/np.max(D)
img_DCT = np.uint8(img_DCT*255)
print (img_DCT)
## image = im.fromarray(img_DCT.astype(np.int))
## image.show()
img_DCT1 = np.zeros((L*24,L*24),np.uint8)
for i in range(L*8):
for j in range(L*8):
img_DCT1[i*3:i*3+3,j*3:j*3+3] = img_DCT[i][j]
cv2.imshow ("DCT Image",img_DCT1)
"""
方法说明:读取一副图像的数据,并以向量的形式给出。
参数说明:filename:图片数据的地址
返回值:PicData:图像数据
"""
def GetPicInformation (self):
nn = self.nn
sn = self.sn
k = 0
self.means = []
XY = []
self.index = np.zeros((self.img.shape[0],self.img.shape[0]))
img = self.img
for i in range(nn):
for j in range(int(nn)):#先从坐到右,再从上到下
data8x8 = img[i*sn:i*sn+8,j*sn:j*sn+8]
self.index[i*sn:i*sn+8,j*sn:j*sn+8] += np.array ([[1 for i in range(8)] for j in range (8)])
if self.samplek == 0:
for ii in range(8):
for jj in range(8):
self.PicData[ii*8+jj][k] = data8x8[jj][ii]
else:
for ii in range(8):
for jj in range(8):
if ii%2 == 0:
self.PicData[ii*8+jj][k] = data8x8[jj][ii]
else:
self.PicData[ii*8+jj][k] = data8x8[7-jj][ii]
k += 1
for k in range(self.PicData.shape[1]):#将图片数据均一化
mean = np.mean(self.PicData[:,k])
self.means.extend ([mean])#求取列数据的均值,存储以备之后恢复使用
self.PicData[:,k] -= mean
"""
方法说明:OMP算法计算系数系数
参数说明:dictionary:已经归一化的字典
dic:未经过归一化的字典
yr:对应的残差
ct;允许最小残差值(单个值的)
返回值:x:求得的稀疏稀疏
"""
def Single_OMP (self,dictionary, dic, yr, ct):
L = dictionary.shape[0]
yrr = yr -np.zeros((L))
add = []#存放被选中原子的位置
A = np.empty(shape=(L,0))#存放被选出来的原子
r = np.linalg.norm(yrr)
t = 0
ct = math.sqrt (ct**2*64)
while t < 32 and r > ct:#进行算法求残差,求其稀疏
t += 1
product = np.dot(yrr.T,dictionary)#yr与字典取内积最大的向量
for i in range(len(product)):
product[i] = abs(product[i])
maxn = np.argmax(product)#找到这行中最大的元素
add.extend([maxn])#存放位置信息
A = np.c_[A,dic[:,maxn]]#将内积最大的原子取出来放到新的矩阵中
#根据公式求残差
xr = np.dot(np.dot(np.linalg.inv(np.dot(A.T, A)), A.T), yr)
yrr = yr - np.dot(A, xr)
r = np.linalg.norm (yrr)
#print ("ok")
x = np.zeros ((256,1))#开始还原原来的稀疏
k = 0
for i in add:#读取指定位置的并将结果存放起来
x[i] = xr[k]
k += 1
return x
"""
方法说明:OMP算法计算稀疏系数
参数说明:dictionary:已经生成的字典
y:图像数据
ct:容许最大的残差
返回值:X:稀疏系数
"""
def OMPLearning (self, dictionary, y, ct=10):
X = np.empty (shape=(256,0))#存放所有的稀疏解
dic = copy.deepcopy(dictionary)
for i in range(dictionary.shape[1]):
avr = np.linalg.norm(dictionary[:,i])#求其列的模值
dictionary[:,i] = dictionary[:,i]/avr#列均一化处理
for i in range(y.shape[1]):#遍历所有的y列
xr = self.Single_OMP (dictionary, dic, y[:,i], ct)#计算每一列对应的稀疏稀疏
X = np.c_[X,xr]#稀疏解
return X
"""
方法说明:K_SVD算法字典学习
参数说明:dictionary:已经生成的字典
y:图像数据
c:容许最大的残差
返回值:X:稀疏系数
首先如果残差设置太大可能会直接跳出循环
"""
def K_SVDLearning (self, DCT, c=5, ct=15, num=4000):
dictionary=copy.deepcopy(DCT)
y=self.PicData
## ch = [random.randint(0,self.nn) for j in range (num)]
## y = np.zeros((64,num),np.uint8)
## for k in range(num):#随机抽取,进行K-SVD去噪
## y.T[k] = yy.T[ch[k]]
x=self.OMPLearning (dictionary, y, ct)
for ci in range(c):
## fo
稀疏字典学习图像去噪
需积分: 50 51 浏览量
2019-06-10
13:15:42
上传
评论 4
收藏 2.44MB RAR 举报
weixin_43287548
- 粉丝: 3
- 资源: 3
最新资源
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
- 基于单片机的风力发电机转速控制源码
- 基于C++实现的风力发电气动平衡监测系统+源代码+测量数据(高分课程设计)
- 毕业设计- 基于STM32F103C8T6 单片机,物联网技术的太阳能发电装置+源代码+文档说明+架构图+界面截图
- 基于 LSTM(长短期记忆)(即改进的循环神经网络)预测风力发电厂中风力涡轮机产生的功率+源代码+文档说明
- 基于stm32f103+空心杯电机+oled按键+运动算法
- 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.1-1.4)
- 基于python实现的水下压缩空气储能互补系统建模仿真与经济效益分析+源代码+论文
- 华中科技大学-自然语言处理实验,Bi-LSTM+CRF的中文分词框架,并且利用基于深度学习的方法进行中文命名实体识别++源码报告
- 基于动态罚函数的铁路车流分配与径路优化模型python源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈