import numpy as np
import math
def rgb_to_yuv(rgb_img):
yuv_img=np.zeros((np.shape(rgb_img)))
yuv_img[...,0]= 0.213*rgb_img[...,0]+0.715*rgb_img[...,1]+0.072*rgb_img[...,2]
yuv_img[...,1]=-0.115*rgb_img[...,0]-0.385*rgb_img[...,1]+0.500*rgb_img[...,2]
yuv_img[...,2]= 0.500*rgb_img[...,0]-0.454*rgb_img[...,1]-0.046*rgb_img[...,2]
return yuv_img
def yuv_to_rgb(yuv_img):
rgb_img=np.zeros((np.shape(yuv_img)))
rgb_img[...,0]=yuv_img[...,0]+1.402*yuv_img[...,2]
rgb_img[...,1]=yuv_img[...,0]-0.344*yuv_img[...,1]-0.792*yuv_img[...,2]
rgb_img[...,2]=yuv_img[...,0]+1.772*yuv_img[...,1]
return rgb_img
def laplace_sharpening(src_img,mode=0):
'''
基于二阶微分拉普拉斯算子的图像锐化.
src_img:原始图像,支持rgb图像或者灰度图像,像素值必须归一化到[0,1]之间,图片矩阵的维度,对于灰度图可以是(h,w)或者(h,w,1),对于rgb图像,必须为(h,w,3).
mode:拉普拉斯算子模板样式,mode=0时,把当前像素相邻的上下左右四个像素统计进来,mode=1时,除了考虑当前像素上下左右四个相邻像素考虑进去之外,还考虑了四个对角像素的影响.
'''
img_shape=np.shape(src_img)
dims=len(img_shape)#图片矩阵的维度
if dims==2 :#如果图片为二维的灰度图,则原图就是亮度图
y_img=src_img
elif dims==3 and img_shape[2]==1:#如果图片的维度是三维,且第三通道为1,则进行维度压缩得到亮度图
y_img=src_img[...,0]
elif dims==3 and img_shape[2]==3:#如果图片是rgb图像,则进行yuv颜色空间转换,y通道为亮度图像
yuv_img=rgb_to_yuv(src_img)
y_img=yuv_img[...,0]
else:
print("error! src_img shoould be rgb image or gray image.")
return
h,w=img_shape[0:2]
pad_y_img=np.pad(y_img,([1,1],[1,1]),"edge")#图片边缘加厚一个像素,加厚那部分像素值用边缘的像素值替代
dst_y_img=np.zeros((h,w))
#以下循环代码,对图片的亮度进行锐化调整
if mode==0:
for i in range(h):
for j in range(w):
dst_y_img[i,j]=5*pad_y_img[i,j]-pad_y_img[i-1,j]-pad_y_img[i+1,j]-pad_y_img[i,j-1]-pad_y_img[i,j+1]
else:
for i in range(h):
for j in range(w):
dst_y_img[i,j]=9*pad_y_img[i,j]-pad_y_img[i-1,j]-pad_y_img[i+1,j]-pad_y_img[i,j-1]-pad_y_img[i,j+1]\
-pad_y_img[i-1,j-1]-pad_y_img[i-1,j+1]-pad_y_img[i+1,j-1]-pad_y_img[i+1,j+1]
dst_y_img=np.clip(dst_y_img,0,1.0)#经过运算,有可能会出现某些像素值小于0或者大于1的情况,为了防止像素值溢出,需要对像素值进行截断处理
if dims==2:#如果原图是二维的灰度图,那么返回的也是二维的灰度图
return dst_y_img
if dims==3 and img_shape[2]==1:
return np.expand_dims(dst_y_img,2)
else:
yuv_img[...,0]=dst_y_img
rgb_img=yuv_to_rgb(yuv_img)
return rgb_img
def blur_mask_sharpening(src_img,kernel_size=9,gain=1):
'''
基于非锐化掩蔽(模糊掩蔽)的图像锐化.
src_img:原始图像,支持rgb图像或者灰度图像,像素值必须归一化到[0,1]之间,图片矩阵的维度,对于灰度图可以是(h,w)或者(h,w,1),对于rgb图像,必须为(h,w,3).
kernel_size:模糊滤波核的尺寸,必须为奇数,可选3、5、7、9、...等.
gain:掩蔽权重系数,当gain<1时表示削弱掩蔽的影响,gain>1表示增强掩蔽的影响.
'''
img_shape=np.shape(src_img)
dims=len(img_shape)#图片矩阵的维度
if dims==2 :#如果图片为二维的灰度图,则将图片的维度扩展为三维的
y_img=src_img
elif dims==3 and img_shape[2]==1:
y_img=src_img[...,0]
elif dims==3 and img_shape[2]==3:
yuv_img=rgb_to_yuv(src_img)
y_img=yuv_img[...,0]
else:
print("error! src_img shoould be rgb image or gray image.")
return
h,w=img_shape[0:2]
pad_size=kernel_size//2
pad_y_img=np.pad(y_img,([pad_size,pad_size],[pad_size,pad_size]),"edge")#图片边缘加厚一个像素,加厚那部分像素值用边缘的像素值替代
dst_y_img=np.zeros((h,w))
for i in range(h):
for j in range(w):
blur=np.mean(pad_y_img[i:i+2*pad_size,j:j+2*pad_size])#均值滤波
mask=pad_y_img[i,j]-blur
dst_y_img[i,j]=pad_y_img[i,j]+gain*mask
dst_y_img=np.clip(dst_y_img,0,1.0)#经过运算,有可能会出现某些像素值小于0或者大于1的情况,为了防止像素值溢出,需要对像素值进行截断处理
if dims==2:#如果原图是二维的灰度图,那么返回的也是二维的灰度图
return dst_y_img
if dims==3 and img_shape[2]==1:
return np.expand_dims(dst_y_img,2)
else:
yuv_img[...,0]=dst_y_img
rgb_img=yuv_to_rgb(yuv_img)
return rgb_img
def grad_sharpening(src_img,grain=1):
'''
基于梯度的图像锐化.
src_img:原始图像,支持rgb图像或者灰度图像,像素值必须归一化到[0,1]之间,图片矩阵的维度,对于灰度图可以是(h,w)或者(h,w,1),对于rgb图像,必须为(h,w,3).
gain:梯度增益系数,当gain<1时表示削弱梯度的影响,gain>1表示增强梯度的影响.
'''
img_shape=np.shape(src_img)
dims=len(img_shape)#图片矩阵的维度
if dims==2 :#如果图片为二维的灰度图,则原图就是亮度图
y_img=src_img
elif dims==3 and img_shape[2]==1:#如果图片的维度是三维,且第三通道为1,则进行维度压缩得到亮度图
y_img=src_img[...,0]
elif dims==3 and img_shape[2]==3:#如果图片是rgb图像,则进行yuv颜色空间转换,y通道为亮度图像
yuv_img=rgb_to_yuv(src_img)
y_img=yuv_img[...,0]
else:
print("error! src_img shoould be rgb image or gray image.")
return
h,w=img_shape[0:2]
pad_y_img=np.pad(y_img,([1,1],[1,1]),"edge")#图片边缘加厚一个像素,加厚那部分像素值用边缘的像素值替代
dst_y_img=np.zeros((h,w))
#以下循环代码,对图片的亮度进行锐化调整
for i in range(h):
for j in range(w):
grad_m=math.fabs(pad_y_img[i+1,j-1]+2*pad_y_img[i+1,j]+pad_y_img[i+1,j+1]-pad_y_img[i-1,j-1]-2*pad_y_img[i-1,j]-pad_y_img[i-1,j+1])\
-math.fabs(pad_y_img[i-1,j+1]+2*pad_y_img[i,j+1]+pad_y_img[i+1,j+1]-pad_y_img[i-1,j-1]-2*pad_y_img[i,j-1]-pad_y_img[i+1,j-1])
dst_y_img[i,j]=pad_y_img[i,j]+grad_m*grain
dst_y_img=np.clip(dst_y_img,0,1.0)#经过运算,有可能会出现某些像素值小于0或者大于1的情况,为了防止像素值溢出,需要对像素值进行截断处理
if dims==2:#如果原图是二维的灰度图,那么返回的也是二维的灰度图
return dst_y_img
if dims==3 and img_shape[2]==1:
return np.expand_dims(dst_y_img,2)
else:
yuv_img[...,0]=dst_y_img
rgb_img=yuv_to_rgb(yuv_img)
return rgb_img

shifenglv
- 粉丝: 1477
最新资源
- 中等职业学校计算机应用基础课程教学革新探讨.docx
- 基于大数据背景下分析人力资源管理的变革策略.docx
- EXCEL常用技巧201004.ppt
- 2-电子商务机理与模式-PPT课件.ppt
- 智能化集成系统子系统接口要求.doc
- CAD2007图层管理办法.ppt
- Oracle错误代码大全.doc
- 基于计算机符号计算的非线性模型孤子解研究的开题报告.docx
- DSP的C语言开发 FIR滤波器设计 PPT.ppt
- 信息化视野下小学语文写作教学策略探究.docx
- Linux下启停Oracle服务.doc
- 探析高职院校管理工作中信息化技术的应用.docx
- 优化活力课堂导学设计评价-促进教育信息化.docx
- 营销有道-浅谈互联网时代下的网络营销模式.docx
- 单片机小系统及片外扩展.pptx
- 2022年自动化求职信集锦6篇.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


