图像处理那点事儿之三特异功能

3.图像特效

你在我眼中是最美,每一个微笑都让我沉醉《最美-羽泉》
特效章节主要涉及到颜色值本身的变化,让我们重温一下,计算机图像由三种基本颜色组成红色、绿色、蓝色、这些颜色值在0到255之间,通过这三种原色的不同组合生成了网络神奇大千世界。

1.灰度处理

灰度处理是特效中最关键的 一趴,既然三种原色不同组合会生成五颜六色,那我们就让它们比例都一样这样就灰了。另外心理学觉得我们这么做太粗暴,于是就有了心理学灰度公式:心理学公式: r0.299+g0.587+b*0.144。上源码

在这里插入图片描述

#灰度处理
#方法一 直接读取灰色
import cv2
import  numpy as np
img = cv2.imread('images/tangwei.jpg',0)
cv2.imshow('jin',img)
cv2.waitKey(0)

#方法二 使用cvtColor
import cv2
import  numpy as np
img = cv2.imread('images/tangwei.jpg',1)
dest = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dest = cv2.resize(dest,(300,500))
cv2.imshow('jin',dest)
cv2.waitKey(0)

#源码之 (r+g+b)/3计算灰度值
import cv2
import numpy as np
img = cv2.imread('images/tangwei.jpg',1)
img_info = img.shape
height = img_info[0]
width = img_info[1]
img_dest = np.zeros((height,width),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        gray = (int(b)+int(g)+int(r))/3
        img_dest[i,j]=np.uint(gray)
cv2.imshow('gaobing',img_dest)
cv2.waitKey(0)

#源码之 心理学公式 r*0.299+g*0.587+b*0.144计算灰度值
import cv2
import numpy as np
img = cv2.imread('images/tangwei.jpg',1)
img_info = img.shape
height = img_info[0]
width = img_info[1]
img_dest = np.zeros((height,width),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        gray = int(b)*0.144+int(g)*0.587+int(r)*0.299
        img_dest[i,j]=np.uint(gray)
cv2.imshow('gaobing',img_dest)
cv2.waitKey(0)

2.颜色反转

这个生成的就是底片效果,简言之用255-像素值,就得到了目标值。

#底版效果 图像反转
#255-像素 得到转换后的像素
import cv2
import numpy as np
image = cv2.imread('images/liuhui.jpg',1)
imageInfo = image.shape
height = imageInfo[0]
width = imageInfo[1]
image_dest = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
    for j in  range(0,width):
        image_dest[i,j]=255-image[i,j]
cv2.imshow('dest',image_dest)
cv2.waitKey(0)

3.马赛克效果

用1个点的值,替换周围n*n固定区域的值;多次替换之后,图片就变成了多个小块重叠的效果。这种方式是直接对原图进行修改,暂时还想不出什么传统的办法可以去掉马赛克,是不是有点失望。如果需求非常强烈,可以尝试使用深度学习中的对抗学习来生成。不过这种技术也只是对区域像素的一种猜想而已。
在这里插入图片描述

#马赛克效果
#用一个像素的值 替代周围固定距离像素的值
import cv2
import numpy as np
image = cv2.imread('images/tangwei.jpg',1)
image_info = image.shape
height = image_info[0]
width = image_info[1]
for i in range(200,300):
    for j in range(100,200):
        if i%10 == 0 and j%10 == 0:
            for m in range(0,10):
                for n in range(0,10):
                    image[i+m,j+n]=image[i,j]
cv2.imshow('images',image)
cv2.waitKey(0)

4.毛玻璃效果

和马赛克正好相反,毛玻璃是随机取周围固定区域的值来替换当前点的值。因为图像中附近点的像素具有相似性,但又不是完全一致 ,所以会出现比较朦胧的效果。
在这里插入图片描述

#毛玻璃效果
#用周围像素的随机值 替换当前像素值
import cv2
import numpy as np
import random
image = cv2.imread('images/tangwei.jpg',1)
image_info = image.shape
height = image_info[0]
width = image_info[1]
image_dest  = np.zeros((height,width,3),np.uint8)
mm = 10
for i in range(0,height-mm):
    for j in range(0,width-mm):
        index_rand = int(random.random()*mm)
        image_dest[i,j] = image[i+index_rand,j+index_rand]
cv2.imshow('image',image_dest)
cv2.waitKey(0)

###5.图片融合
突然想说,很多名词起的很高大上给学习者带来了很大的压力。但是大道至简,说到底还都是一生二,二生三,三胜万物。
图片融合就是把两张图片的像素加权求和,有点类似于风格迁移。当然你得先让两张图片大小相同。
在这里插入图片描述

#图片融合 即把两个相同尺寸的图片区域进行加权求和
#方法一::从图像中把区域切出来进行融合
import cv2
import numpy as np
image1 = cv2.imread('images/tongliya.jpg',1)
image2 = cv2.imread('images/jinzhiyuan.jpg',1)
image1_info = image1.shape
height = int(image1_info[0]/2)
width = int(image1_info[1]/2)
image_dest = cv2.addWeighted(image1[0:height,0:width],0.5,image2[0:height,0:width],0.5,0)
cv2.imshow('image',image_dest)
cv2.waitKey(0)

#图片融合 即把两个相同尺寸的图片区域进行加权求和
#方法一::将两个图片resize后进行融合
import cv2
import numpy as np
image1 = cv2.imread('images/tongliya.jpg',1)
image2 = cv2.imread('images/jinzhiyuan.jpg',1)
image3 = cv2.imread('images/peixiuzhi.jpg',1)
image4 = cv2.imread('images/linyuner.jpg',1)
image1_re = cv2.resize(image1,(500,500))
image2_re = cv2.resize(image2,(500,500))
image3_re = cv2.resize(image3,(500,500))
image4_re = cv2.resize(image4,(500,500))
image_dest = cv2.addWeighted(image1_re,0.5,image2_re,0.5,0)
image_dest = cv2.addWeighted(image1_re,0.5,image2_re,0.5,0)
image_dest = cv2.addWeighted(image_dest,0.5,image3_re,0.5,0)
image_dest = cv2.addWeighted(image_dest,0.5,image4_re,0.5,0)
cv2.imshow('image',image_dest)
cv2.waitKey(0)

6.边缘检测

如何才能知道什么地方是图像的边缘呢?那我们看看边缘的像素点有什么样的特征,我去居然发现了。边缘像素点跟周围点的差距都有点大。那么就可以利用像素和周围点的差,设置一个阈值去判断边缘。
在这里插入图片描述

#边缘检测 
#1.灰度处理
#2.高斯滤波
#3.canny边缘检测
import cv2
import numpy as np
img = cv2.imread('images/tangwei.jpg',1)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯滤波机型 平滑处理
cv2.GaussianBlur(img,(3,3),0)
img_dest = cv2.Canny(img,50,50)
cv2.imshow('img',img_dest)
cv2.waitKey(0)

#源码篇
import cv2
import numpy as np
import math
img = cv2.imread('images/tangwei.jpg',0)
img_info = img.shape
height = img_info[0]
width = img_info[1]
#1.sobel算子去卷积图片中的每个区域
#根据卷积结果平方和开根号 判断梯度  因为sobel算子的格式 其实相当于mse
'''1   2  1      1  0  -1
   0   0  0      2  0  -2
   -1 -2  -1     1  0  -1
'''
img_dest = np.zeros((height,width,1),np.uint8)
for i in range(0,height-2):
    for j in range(0,width-2):
        dy = img[i,j]+img[i,j+1]*2+img[i,j+2]-img[i+2,j]-img[i+2,j+1]*2-img[i+2,j+2]
        dx = img[i,j]+img[i+1,j]*2+img[i+2,j]-img[i,j+2]-img[i+1,j+1]*2-img[i+2,j+2]
        grad = math.sqrt(dx**2+dy**2)
        if grad>40:
             img_dest[i,j] = 255
        else:
             img_dest[i,j] = 0
cv2.imshow('img',img_dest)
cv2.waitKey(0)

###7.浮雕效果
为了让图像具有层次感的突出,我们的目标是尽量把不同的区域给区分开来,强化区域间的差异,弱化区域内的差异,实现的手段就是用 当前点的值-下一个点的值+150;因为不同区域间像素的差不一样,从而实现了我们要的浮雕效果。
在这里插入图片描述

#浮雕效果
#当前像素点 = 当前值-下一个点的值+150(个人理解150相当于突出的程度)
import cv2
import numpy as np
import math
img = cv2.imread('images/tongliya.jpg',0)
img_info = img.shape
height = img_info[0]
width = img_info[1]
img_dest = np.zeros((height,width,1),np.uint8)
for i in range(0,height):
    for j in range(0,width-1):
        newp = int(img[i,j])-int(img[i,j+1])+150
        if newp > 255:
            newp = 255
        if newp < 0:
            newp = 0
        img_dest[i,j] = newp
cv2.imshow('img',img_dest)
cv2.waitKey(0)

###8.颜色风格
对于三种原色调,我们使色调的比例和原来不一样就可以实现风格的转换。我突然想到林青霞。
在这里插入图片描述

#将特定的某种原色增强,实现整体风格改变
import cv2
import numpy as np
img = cv2.imread('images/tangwei.jpg',1)
img_info = img.shape
height = img_info[0]
width = img_info[1]
img_dest = np.zeros((height,width,3),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        b_new = b*1.5
        if b_new > 255:
            b_new = 255
        g_new = g*1.3
        if g_new >255:
            g_new = 255
        img_dest[i,j]=(b_new,g_new,r)
cv2.imshow('img',img_dest)
cv2.waitKey(0)

9.图像和视频转换

因为视频的本质是将图像编码之后存储起来,那么视频转图片就是将视频解码之后,使用图片读出来;图像转视频即先进行编码,在写入到视频中;核心的方法cv2.VideoCapture和cv2.VideoWriter

#将视频转化为图片
#原理 视频本就是由许多张连续的图片组成的 
#1.使用cv2.VideoCpture 读取视频 2. 使用isOpend判断是否打开 3.使用open属性进行读取图片
import cv2
cap = cv2.VideoCapture('lisa.mp4')
isOpend = cap.isOpened
i = 0
while isOpend:
    i += 1
    if i == 100:
        break
    (flag,frame) = cap.read()
    filename =  'lisa'+str(i)+'.jpg'
    if flag == True:
        cv2.imwrite('file/'+filename,frame)


#图片合成视频
#1.生成videoWrite构造器
#读取原始图片,使用videowrite写入
import cv2
img = cv2.imread('file\lisa1.jpg',3)
img_info = img.shape

height  =  img_info[0]
width = img_info[1]
print(width)
VideoWrite = cv2.VideoWriter('lisa.mp4',-1,4,(width,height))
for i in range(1,100):
    #file_name 一定要先定义变量进行拼接,如果直接加载imread中读取不到
    file_name = 'file\lisa'+str(i)+'.jpg'
    img_save = cv2.imread(file_name)
    VideoWrite.write(img_save)

特效环节到此就结束了,你用尽了千般技巧终于得到了女神的芳心。请你一定要好好的对待她,因为渣男真的很讨厌。用你的行动告诉她,蒲苇纫如丝,磐石无转移。继续努力,使自己更优秀吧!
至此,我们的图像处理那点事儿系列暂时就告一段落了,江湖有缘再见!

猜你喜欢

转载自blog.csdn.net/gaobing1993/article/details/108105049