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
![avatar](https://profile-avatar.csdnimg.cn/ab4f40fbfd74428b953ca8a1b0ecde61_qq_28249373.jpg!1)
shifenglv
- 粉丝: 1445
- 资源: 78
最新资源
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
- C语言-leetcode题解之第165题比较版本号.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)