import cv2
import numpy as np
import matplotlib.pyplot as plt
import math
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')#读取图像
src=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
dst1=np.zeros_like(img)
rows,cols=img.shape[:2]#获取图像行和列
#毛玻璃特效
offsets=5
random_num=0
for y in range(rows-offsets):
for x in range(cols-offsets):
random_num=np.random.randint(0,offsets)
dst1[y,x]=src[y+random_num,x+random_num]
#油漆特效
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
kernel=np.array([[-1,-1,-1],[-1,10,-1],[-1,-1,-1]])#卷积核
#浮雕效果
dst2=cv2.filter2D(gray,-1,kernel)
#素描特效
gaussian=cv2.GaussianBlur(gray,(5,5),0)#高斯滤波
canny=cv2.Canny(gaussian,50,150)#Canny算子
ret,dst3=cv2.threshold(canny,100,255,cv2.THRESH_BINARY_INV)#二值化阈值处理
#怀旧特效
dst4=np.zeros((rows,cols,3),dtype="uint8")
for i in range(rows):
for j in range(cols):
B=0.272*img[i,j][2]+0.534*img[i,j][1]+0.131*img[i,j][0]
G=0.349*img[i,j][2]+0.686*img[i,j][1]+0.168*img[i, j][0]
R=0.393*img[i,j][2]+0.769*img[i,j][1]+0.189*img[i,j][0]
if B>255:
B=255
if G>255:
G=255
if R>255:
R=255
dst4[i,j]=np.uint8((B,G,R))
#光照特效
#设置中心点
centerX=rows/2
centerY=cols/2
print(centerX,centerY)
radius=min(centerX,centerY)
print(radius)
strength=200#设置光照强度
dst5=np.zeros((rows,cols,3),dtype="uint8")
for i in range(rows):
for j in range(cols):
#计算当前点到光照中心的距离(平面坐标系中两点之间的距离)
distance=math.pow((centerY-j),2)+math.pow((centerX-i),2)
#获取原始图像
B=src[i,j][0]
G=src[i,j][1]
R=src[i,j][2]
if (distance<radius*radius):
#按照距离大小计算增强的光照值
result=(int)(strength*(1.0-math.sqrt(distance)/radius))
B=src[i,j][0]+result
G=src[i,j][1]+result
R=src[i,j][2]+result
B=min(255,max(0, B))
G=min(255,max(0, G))
R=min(255,max(0, R))
dst5[i,j]=np.uint8((B,G,R))
else:
dst5[i,j]=np.uint8((B,G,R))
#怀旧特效
dst6=np.zeros((rows,cols,3),dtype="uint8")
for i in range(rows):
for j in range(cols):
B=math.sqrt(src[i,j][0])*12
G=src[i,j][1]
R=src[i,j][2]
if B>255:
B=255
dst6[i,j]=np.uint8((B,G,R))
#卡通特效
num_bilateral=7#双边滤波
img_color=src#高斯金字塔
for i in range(num_bilateral):
img_color=cv2.bilateralFilter(img_color,d=9,sigmaColor=9,sigmaSpace=7)#双边滤波处理
img_gray=cv2.cvtColor(src,cv2.COLOR_RGB2GRAY)
img_blur=cv2.medianBlur(img_gray, 7)#中值滤波
img_edge=cv2.adaptiveThreshold(img_blur,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,blockSize=9,C=2)#自适应阈值处理
img_edge=cv2.cvtColor(img_edge,cv2.COLOR_GRAY2RGB)
dst6=cv2.bitwise_and(img_color,img_edge)#与运算
#均衡化特效
dst7=np.zeros((rows,cols,3),dtype="uint8")
(b,g,r)=cv2.split(src)
#彩色图像均衡化
bH=cv2.equalizeHist(b)
gH=cv2.equalizeHist(g)
rH=cv2.equalizeHist(r)
dst7=cv2.merge((bH, gH, rH))
#边缘特效
gaussian=cv2.GaussianBlur(gray,(3,3),0)#高斯滤波
#Scharr算子
x=cv2.Scharr(gaussian,cv2.CV_32F,1,0)
y=cv2.Scharr(gaussian,cv2.CV_32F,0,1)
absX=cv2.convertScaleAbs(x)
absY=cv2.convertScaleAbs(y)
dst8=cv2.addWeighted(absX,0.5,absY,0.5,0)
plt.rcParams['font.sans-serif']=['SimHei']
titles=['原图','毛玻璃','浮雕','素描','怀旧','光照','卡通','均衡化','边缘']
images=[src,dst1,dst2,dst3,dst4,dst5,dst6,dst7,dst8]
for i in range(9):
plt.subplot(3,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
if __name__=='__main__':
plt.show()
230.0 230.0 230.0
算法:图像美化是用计算机对图像进行分析以达到所需效果的技术。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!