本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!
前文参考:
《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现
《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造
《OpenCv视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
《OpenCv视觉之眼》Python图像处理十五 :Opencv图像处理之图像缩放、旋转和平移原理及实现
《OpenCv视觉之眼》Python图像处理十六:Opencv项目实战之图像中的硬币检测
《OpenCv视觉之眼》Python图像处理十七:Opencv图像处理实战二之图像中的物体识别并截取
《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测
《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测
上次博客,我们进行了OpenCV图像处理的实战五,而本次博客,作为之前《OpenCV视觉之眼》的章节补充,发现讲解了基本的图像处理过程,却没有将如何对图像进行特效处理,对于大多数图像使用的用户而言,绝大部分的目的是为了如何使得图像美化,而并不是将检测出图像中的物体。
因此,本次博客做一个对图像进行特效处理的补充文章,通过原理,进行一系列的图像美化,包括美图秀秀中常用的流年、浮雕、素描、怀旧、滤镜等处理;请给你的图像美个颜,然后一起学习吧!
曾几何时,你也用过美图秀秀P过图;曾几何时,你也想过将图像变得更加的好看,更加的适合你的心意,例如加一些水印,添加一些非主流的名字,将图片进行一些处理使得变为情侣头像,那时候,你在为用什么软件发愁,那时候,你在为怎么设计发愁;而相反的,软件商家在为如何对图片处理有更多的特效发愁;但在现在看来,这一切都不再是难题,因为林君学长带你们理解原理!
流年是用来形容如水般流逝的光阴或年华,图像处理中特指将原图像转换为具有时代感或岁月沉淀的特效,特效效果对比如下所示:
1)原理:将原始彩色图像的蓝色(B)通道的像素值开根号,再乘以一个权重参数,产生最终的流年效果。
2)、计算公式
i m g 1 [ i , j ] = [ i m g [ i , j , 0 ] ∗ w e i g h t , i m g [ i , j , 1 ] , i m g [ i , j , 2 ] ] 其 中 , w e i g h t 为 权 重 值 , 是 需 要 我 们 进 行 传 递 的 参 数 , i m g 为 原 始 图 像 , i m g 1 为 流 年 特 效 处 理 之 后 的 图 像 img1[i,j]=[\sqrt{img[i,j,0]}*weight,img[i,j,1],img[i,j,2]]\\\\ 其中,weight为权重值,是需要我们进行传递的参数,img为原始图像,img1为流年特效处理之后的图像 img1[i,j]=[img[i,j,0]∗weight,img[i,j,1],img[i,j,2]]其中,weight为权重值,是需要我们进行传递的参数,img为原始图像,img1为流年特效处理之后的图像
那么通过以上原理和公式,我们便可以对图像进行流年的特效处理,如下步骤
1)、图像流年特效功能函数构造
'''
图像流年处理
'''
#图像流年处理函数构造
def chronology(img,weight):
#获取图像属性
h,w=img.shape[0:2]
#定义空白图像,存放图像流年处理之后的图片
img1=np.zeros((h,w,3),dtype=img.dtype)
#通过对原始图像进行遍历,通过流年公式修改B通道的像素值,然后进行流连处理
for i in range(h):
for j in range(w):
B=int(np.sqrt(img[i,j,0])*weight)#对通道B的像素值开方,然后乘以权重
if B>255:
B=255
img1[i,j]=[B,img[i,j,1],img[i,j,2]]
return img1
2)、读取图像,调用图像流年函数,对图像进行流年处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像流年处理函数,进行图像流年处理
chronology=chronology(img,15)#传递权重参数15
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
chronology=cv2.cvtColor(chronology,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像流年特效']
images = [img, chronology]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
对于图像流年的效果,大家可以自行调节权重参数进行设置,不同的权重参数处理得到不同的结果,但总有一个结果适合你的审美!
图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈圆形范围内的增强,特效如下所示:
1)、原理:通过双层循环遍历图像的各像素点,寻找图像的中心点,再通过计算当前点到光照中心的距离(平面坐标系中两点之间的距离),判断该距离与图像中心圆半径的大小关系,中心圆范围内的图像像素值增强,范围外的图像像素值保留,并结合边界范围判断生成最终的光照效果
2)、计算公式:圆的公式 x 2 + y 2 = r 2 x^2+y^2=r^2 x2+y2=r2
确 定 图 像 中 心 点 ( x , y ) = ( h / 2 , w / 2 ) ; x , y 表 示 图 像 中 心 点 , h , w 表 示 图 像 高 和 宽 确 定 半 径 : 半 径 这 里 设 置 为 中 心 点 中 的 最 小 值 , 当 然 , 也 可 以 自 己 进 行 设 定 , r a d i u s = m i n ( c e n t e r X , c e n t e r Y ) 计 算 像 素 点 到 中 心 点 的 距 离 平 方 : d i s t a n c e = ( x − i ) 2 + ( y − j ) 2 { 如 果 d i s t a n c e < = r a d i u s 2 img1[i,j]=设定的光照强度值 如 果 d i s t a n c e > r a d i u s 2 , img1[i,j]=img[i,j] 其 中 i m g 1 [ i , j ] 表 示 关 照 处 理 之 后 的 图 像 在 ( i , j ) 点 的 像 素 , i m g [ i , j ] 表 示 原 图 在 ( i , j ) 点 的 像 素 确定图像中心点(x,y)=(h/2,w/2);x,y表示图像中心点,h,w表示图像高和宽\\\\ 确定半径:半径这里设置为中心点中的最小值,当然,也可以自己进行设定,radius = min(centerX, centerY)\\\\ 计算像素点到中心点的距离平方: distance = (x-i)^2+(y-j)^2\\\\ \begin{cases} 如果distance <=radius ^2 & \text {img1[i,j]=设定的光照强度值} \\ 如果distance >radius ^2, & \text{img1[i,j]=img[i,j]} \end{cases}\\\\ 其中img1[i,j]表示关照处理之后的图像在(i,j)点的像素,img[i,j]表示原图在(i,j)点的像素 确定图像中心点(x,y)=(h/2,w/2);x,y表示图像中心点,h,w表示图像高和宽确定半径:半径这里设置为中心点中的最小值,当然,也可以自己进行设定,radius=min(centerX,centerY)计算像素点到中心点的距离平方:distance=(x−i)2+(y−j)2{如果distance<=radius2如果distance>radius2,img1[i,j]=设定的光照强度值img1[i,j]=img[i,j]其中img1[i,j]表示关照处理之后的图像在(i,j)点的像素,img[i,j]表示原图在(i,j)点的像素
通过以上原理,我们便可以构造图像光照功能函数了,如下步骤
1)、图像光照功能函数构造
'''
图像光照处理
'''
#图像光照处理函数构造
def illumination(img,lightIntensity):#参数为原图像和光照强度
#获取图像属性
h,w=img.shape[0:2]
#定义空白图像,存放图像光照处理之后的图片
img1=np.zeros((h,w,3),dtype=img.dtype)
#确定中心点的位置
x,y=int(h/2),int(w/2)
#确定半径
r=min(x,y)
#通过对原始图像进行遍历,通过光照公式修改像素值,然后进行光照处理
for i in range(h):
for j in range(w):
#计算像素点i,j到中心点的距离的平方
distance=(x-i)**2+(y-j)**2
#比较距离与半径的大小,当距离大于半径,不做处理,当距离小于等于半径,设置为光照强度值
if distance>r**2:
img1[i,j]=img[i,j]
else:
result=int(lightIntensity*(1.0-np.sqrt(distance)/r ))#通过距离来计算光照强度值
#光照特效处理后的图像三通道值与255取最小,防止溢出(0和结果中选择最大的,结果和255中选择最小的)
B=min(max(0,img[i,j,0]+result),255)
G=min(max(0,img[i,j,1]+result),255)
R=min(max(0,img[i,j,2]+result),255)
img1[i,j]=[B,G,R]#B\G\R三通道都设置为光照强度值
return img1
2)、读取图像,调用图像光照处理函数进行光照处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像光照处理函数,进行图像光照处理
illumination=illumination(img,150)#传递光照强度为200
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
illumination=cv2.cvtColor(illumination,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像光照特效']
images = [img, illumination]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
通过传递不同光照强度的参数,我们可以设定不同光照图像处理,总有一款曝光适合你的自拍处理哦!
值得注意的是,我们输入的光照强度请输入正数哦,防止发生像素的反向溢出,及小于0
图像浮雕特效是仿造浮雕艺术而衍生的处理,它将要呈现的图像突起于石头表面,根据凹凸程度不同形成三维的立体效果,浮雕特效如下所示:
1)、原理:绘制浮雕图像是通过勾画图像的轮廓,并降低周围的像素值,从而产生一张具有立体感的浮雕效果图,传统的方法是设置卷积核,再调用OpenCV的filter2D()函数实现浮雕特效,后面会讲到;而本次介绍的主要通过对图像进行灰度处理后,相邻像素做差,在差的基础上加上一个固定的值,如200
2)、计算公式
前 一 个 像 素 值 = i n t ( g r a y [ i , j ] ) 后 一 个 像 素 值 = i n t ( g r a y [ i , j + 1 ] ) 新 的 像 素 值 = 前 一 个 像 素 值 − 后 一 个 像 素 值 + 150 前一个像素值= int(gray[i,j])\\\\ 后一个像素值= int(gray[i,j+1])\\\\ 新的像素值= 前一个像素值- 后一个像素值+ 150 前一个像素值=int(gray[i,j])后一个像素值=int(gray[i,j+1])新的像素值=前一个像素值−后一个像素值+150
以上原理其实很简单的,对于python代码来说,只需要对图像进行遍历就可以实现,如下步骤
1)、图像浮雕功能函数构造
'''
图像浮雕处理
'''
#图像浮雕处理函数构造
def relief(img,Degree):#参数为原图像和浮雕图像程度
#图像灰度处理
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#获取图像属性
h,w=gray.shape[0:2]
#定义空白图像,存放图像浮雕处理之后的图片
img1=np.zeros((h,w),dtype=gray.dtype)
#通过对原始图像进行遍历,通过浮雕公式修改像素值,然后进行浮雕处理
for i in range(h):
for j in range(w-1):
#前一个像素值
a=gray[i,j]
#后一个像素值
b=gray[i,j+1]
#新的像素值,防止像素溢出
img1[i,j]=min(max((int(a)-int(b)+Degree),0),255)
return img1
2)、读取图像,调用图像浮雕功能函数,对图像进行浮雕处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像浮雕处理函数,进行图像浮雕处理
relief=relief(img,160)#设置浮雕图像程度值为160
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
relief=cv2.cvtColor(relief,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像浮雕特效']
images = [img, relief]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
通过设置不同的浮雕图像程度值,可以得到不同的浮雕图像视觉,在满眼的3D视觉中,你的自拍,总会若隐若现,犹如3D般的视觉效果,没错,这就是浮雕特效,一个将你照片中的美丽事物打印出来的特效,调节参数,让照片中的人物走出来吧!
3)、浮雕处理的传统方法
在浮雕开始的时候,我们说到,浮雕的传统方法是通过设置卷积核,再调用OpenCV的filter2D()函数实现浮雕特效。该函数主要是利用内核实现对图像的卷积运算,函数原型:relief= filter2D(img, ddepth, kernel)
这里我们看一下传统方法的效果,完整代码如下:
'''浮雕传统OpenCV特效处理方法'''
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像浮雕处理函数,进行图像浮雕处理
kernel = np.array([[-1,0,0],[0,1,0],[0,0,0]])
relief = cv2.filter2D(img, -1, kernel)
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
relief=cv2.cvtColor(relief,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像浮雕特效-OpenCV处理方法']
images = [img, relief]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
在看一下效果吧:
怎样?这个效果是不是让你大失所望,不过没有关系,掌握相邻像素做差法就ok拉!
1)、原理:通过边缘检测及阈值化处理能实现该功能。一幅图像的内部都具有相似性,而在图像边界处具有明显的差异,边缘检测利用数学中的求导来扩大这种变化。但是求导过程中会增大图像的噪声,所以边缘检测之前引入了滤波降噪处理。
2)、图像素描原理步骤
以上每个步骤的原理我们都通过该系列博客前面的章节讲解过,而且给出了原理代码和使用OpenCV库函数的代码,而这里了,为了加快图像素描的处理速度,我们将直接使用OpenCV库函数进行图像素描处理,如果需要了解以上步骤实现的原理,请参考该博客系列教程的前面对应章节
1)、图像素描功能函数构造
'''
图像素描处理
'''
#图像素描处理函数构造
def Sketch(img):#参数为原图像
#图像灰度处理
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#通过高斯滤波过滤噪声
gaussian = cv2.GaussianBlur(gray, (3,3), 0)
#通过canny算法提取图像轮过
canny = cv2.Canny(gaussian, 50, 140)
#对轮廓图像进行反二进制阈值化处理
ret, result = cv2.threshold(canny, 90, 255, cv2.THRESH_BINARY_INV)
return result
2)、读取图像,调用图像素描功能函数,对图像进行素描处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像素描处理函数,进行图像素描处理
Sketch=Sketch(img)
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
Sketch=cv2.cvtColor(Sketch,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像素描特效']
images = [img, Sketch]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
图像怀旧特效是指图像经历岁月的昏暗效果,使得让人的肉眼看到感觉如同过去的事物一般,让人勾起那枯藤老树昏鸦的沧桑回忆的情感;怀旧效果如下:
1)原理:图像怀旧的原理就是对图像3通道B\G\R通过不同的特定的权重处理,形成新的3通道图像,主要通过双层循环遍历图像的各像素点,再结合该公式计算各颜色通道的像素值,最终生成图像怀旧效果,而对于为什么是这些特定的权重,林君学长也没有查询到资料啦,真是一种怀旧的权重哎!
2)、计算公式
B = 0.189 b + 0.769 g + 0.393 r G = 0.168 b + 0.686 g + 0.349 r R = 0.131 b + 0.534 g + 0.272 r B=0.189b+0.769g+0.393r\\\\ G=0.168b+0.686g+0.349r\\\\ R=0.131b+0.534g+0.272r B=0.189b+0.769g+0.393rG=0.168b+0.686g+0.349rR=0.131b+0.534g+0.272r
那么通过以上公式构造图像怀旧功能函数是不是就简单很多啦,一起来看下吧!
1)、图像怀旧功能函数构造
'''
图像怀旧处理
'''
#图像光照处理函数构造
def Nostalgia(img):#参数为原图像
#获取图像属性
h,w=img.shape[0:2]
#定义空白图像,存放图像怀旧处理之后的图片
img1=np.zeros((h,w,3),dtype=img.dtype)
#通过对原始图像进行遍历,通过怀旧公式修改像素值,然后进行怀旧处理
for i in range(h):
for j in range(w):
B=0.131*img[i,j,0]+0.534*img[i,j,1]+0.272*img[i,j,2]
G=0.168*img[i,j,0]+0.686*img[i,j,1]+0.349*img[i,j,2]
R=0.189*img[i,j,0]+0.769*img[i,j,1]+0.393*img[i,j,2]
#防止图像溢出
if B>255:
B = 255
if G>255:
G = 255
if R>255:
R = 255
img1[i,j]=[int(B),int(G),int(R)]#B\G\R三通道都设置为怀旧值
return img1
2)、读取图像,调用图像怀旧功能函数,对图像进行怀旧处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像怀旧处理函数,进行图像怀旧处理
Nostalgia=Nostalgia(img)
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
Nostalgia=cv2.cvtColor(Nostalgia,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像怀旧特效']
images = [img, Nostalgia]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
有没有一点过去的感觉,是否勾起了你的回忆,可惜的是这段代码并不能让时间倒退,只能勾起你的对过去回忆的无限思维,夕阳夕下,你们共在天涯!
天啦,我怎么不知道品如有这件衣服^ _ ^
滤镜主要是用来实现图像的各种特殊效果,它在Photoshop中具有非常神奇的作用。滤镜通常需要同通道、图层等联合使用,才能取得最佳艺术效果,滤镜特效如下所示:
1)、原理:假设现在存在一张新的滤镜颜色查找表,包含各像素颜色分布的图像;然后通过演示查找表,对每一个原始颜色进行转换之后得到新的颜色。比如,原始图像的某像素点为红色(R-255, G-0, B-0),进行转换之后变为绿色(R-0, G-255, B-0),之后所有是红色的地方都会被自动转换为绿色,而颜色查找表就是将所有的颜色进行一次(矩阵)转换,很多的滤镜功能就是提供了这么一个转换的矩阵,在原始色彩的基础上进行颜色的转换。
2)、颜色查找表如下所示(尺寸512x512)
通过自定义getBRG()函数获取颜色查找表中映射的滤镜颜色,再依次循环替换各颜色。
1)、自定义获取颜色查找表中的滤镜颜色
'''
图像滤镜处理
'''
# 获取滤镜颜色
def getBGR(img,table, i,j):
# 获取图像颜色
b, g, r = img[i][j]
# 计算标准颜色表中颜色的位置坐标
x = int(g / 4 + int(b / 32) * 64)
y = int(r / 4 + int((b % 32) / 4) * 64)
# 返回滤镜颜色表中对应的颜色
return table[x][y]
2)、图像滤镜功能函数构造
#图像滤镜功能函数构造
def Filter(img,filter1):
# 获取图像属性
h,w=img.shape[:2]
#定义空白图像,存放图像滤镜处理之后的图片
img1=np.zeros((h,w,3),dtype=img.dtype)
# 通过对原图像遍历,设置滤镜颜色
for i in range(h):
for j in range(w):
#通过演示查找表进行颜色转换
img1[i][j]=getBGR(img,filter1,i,j)
return img1
3)、读取图像,调用图像滤镜功能函数,对图像进行滤镜处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#读取滤镜查找表
filter1=cv2.imread('1.jpg')
#调用图像怀旧处理函数,进行图像怀旧处理
Filter=Filter(img,filter1)#传递图像和颜色查找表
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
Filter=cv2.cvtColor(Filter,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像滤镜特效']
images = [img, Filter]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
可以看到,图像滤镜之后,将原图的所有像素通过滤镜查找表重新改变一次,实现滤镜的美化效果,你可能不是万一挑一,但你始终是自己的唯一!
图像毛玻璃是是将图像模糊化,如同一般办公室那种磨砂门,给人虚幻的感觉,不能够看到里面的内容,是图像处理中通常用到的一种;毛玻璃特效如下所示:
1)、原理:用图像邻域内随机一个像素点的颜色来替代当前像素点颜色的过程,从而为图像增加一个毛玻璃模糊的特效
2)、计算公式
在 该 像 素 点 随 机 挑 选 一 个 领 域 点 , 用 n u m 来 确 定 周 围 是 几 领 域 , 并 且 随 机 给 出 周 围 领 域 的 的 点 r a n d o m = n p . r a n d o m . r a n d i n t ( 0 , n u m ) i m g 1 [ i , j ] = i m g [ i + r a n d o m , j + r a n d o m ] 在该像素点随机挑选一个领域点,用num来确定周围是几领域,并且随机给出周围领域的的点\\\\ random= np.random.randint(0,num)\\\\ img1[i,j] = img[i+random,j+random] 在该像素点随机挑选一个领域点,用num来确定周围是几领域,并且随机给出周围领域的的点random=np.random.randint(0,num)img1[i,j]=img[i+random,j+random]
通过以上原理,便可以设计我们的毛玻璃特效了,如下步骤
1)、图像毛玻璃功能函数构造
'''
图像毛玻璃处理
'''
#图像毛玻璃处理函数构造
def frostedGlass(img,size):#参数为原图像和邻域大小
num = int((size - 1) / 2) # 输入图像需要填充的尺寸
#由于是领域内的点,因此,我们首先需要确定领域的大小,进行扩边
img = cv2.copyMakeBorder(img, num, num, num, num, cv2.BORDER_REPLICATE)#对原图像进行扩充,处理黑边
#获取图像属性
h,w=img.shape[0:2]
#定义空白图像,存放图像毛玻璃处理之后的图片
img1=np.zeros((h,w,3),dtype=img.dtype)
#定义随机数
random= 0
#通过对原始图像进行遍历,通过毛玻璃公式修改像素值,然后进行毛玻璃处理
for i in range(num,h-num):
for j in range(num,w-num):
#在该像素点随机挑选一个领域点,用num来确定周围是几领域,并且随机给出周围领域的的点
random=np.random.randint(0,num)
img1[i,j]=img[i+random,j+random]
img1 = img1[(0 + num):(h-num), (0+num):(h-num)]#裁剪原图
return img1
2)、读取图像,调用图像毛玻璃功能函数,对图像进行毛玻璃处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用图像毛玻璃处理函数,进行图像毛玻璃处理
frostedGlass=frostedGlass(img,11)#11邻域的毛玻璃特效处理
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
frostedGlass=cv2.cvtColor(frostedGlass,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像毛玻璃特效']
images = [img, frostedGlass]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
模糊的朦胧美,相信是大多数小伙伴在进行美图秀秀中常用的伎俩吧,今天可以看到处理的原理啦!
图像油漆特效类似于油漆染色后的轮廓图形,是美化图像的另一种视觉体验,可以提示图像锐度和饱和度,图像油漆特效如下所示:
1)、原理:原图像通过特定的3x3卷积核与周围邻域进行卷积得到的效果,卷积模板如下所示:
K ( 3 , 3 ) = [ − 1 − 1 − 1 − 1 10 − 1 − 1 − 1 − 1 ] K(3,3)=\begin{bmatrix} -1 & -1 & -1 \\ -1 & 10 & -1 \\-1 & -1 & -1 \end{bmatrix} K(3,3)=⎣⎡−1−1−1−110−1−1−1−1⎦⎤
2)、计算公式
该计算公式没有什么需要介绍的,就是像素周围的(包括该像素点本身)9个点的像素分别于卷积末班对于相乘然后相加得到一个新的像素,如下步骤
1)、图像油漆功能函数构造
'''
图像油漆处理
'''
#图像油漆处理函数构造
def paint(img):#参数为原图像和邻域大小
#对原图像进行扩充,处理黑边
img = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_REPLICATE)
#获取图像属性
h,w=img.shape[0:2]
#定义空白图像,存放图像油漆处理之后的图片
img1=np.zeros((h,w,3),dtype=img.dtype)
#定义卷积模板
kernel=np.array([[-1,-1,-1],[-1,10,-1],[-1,-1,-1]])
#通过对原始图像进行遍历,通过油漆公式修改像素值,然后进行油漆处理
for i in range(1,h-1):
for j in range(1,w-1):
#周围邻域与模板进行卷积并防止像素溢出
B=min(max(0,np.sum(img[i-1:i+1+1,j-1:j+1+1,0]*kernel)),255)
G=min(max(0,np.sum(img[i-1:i+1+1,j-1:j+1+1,1]*kernel)),255)
R=min(max(0,np.sum(img[i-1:i+1+1,j-1:j+1+1,2]*kernel)),255)
img1[i,j]=[B,G,R]
img1 = img1[(0 + 1):(h-1), (0+1):(h-1)]#裁剪恢复原图
return img1
2)、读取图像,调用图像油漆功能函数,对图像进行油漆处理
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#调用油漆函数,进行图像油漆处理
paint = paint(img)
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
paint=cv2.cvtColor(paint,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像油漆特效']
images = [img, paint]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
图像油漆效果相当于给图像的饱和度和锐度都有一定的提示,适合对图片进行光线增加,上面的卷积同样也可以用cv2.filter2D函数完整,核心代码如下所示:
#导入函数库
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf) #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("my.jpg")
#自定义卷积核
kernel=np.array([[-1,-1,-1],[-1,10,-1],[-1,-1,-1]])
#调用filter2D函数,进行图像油漆处理
#图像浮雕效果
paint = cv2.filter2D(img, -1, kernel)
#BGR转换为RGB显示格式,方便通过matplotlib进行图像显示
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
paint=cv2.cvtColor(paint,cv2.COLOR_BGR2RGB)
#图像与原图显示对比
titles = [ '原图像', '图像油漆特效']
images = [img, paint]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i])
plt.title(titles[i])
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()
可以看到,效果是一样的,具体选择哪一种处理方法,小伙伴们自己抉择吧!
以上就是本次博客的全部内容,如果对你美化图像有所帮助,请一定记得点赞关注啦;遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!
生路上,很多时候看不清未来,回不到过去。那么,就别让时间在眺望未来中流逝,莫让年华在回忆过去中沧桑,把握今天,开心享受每一天
陈一月的又一天编程岁月^ _ ^