opencv 图像处理常用特效

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38863413/article/details/88074961

使用opencv 进行图像特效的处理,包括 灰度图像的处理(基础),图像颜色反转,图像马赛克效果,图像毛玻璃效果,图像边缘检测,图像融合,浮雕效果,颜色映射效果,油画特效,使用opencv 3 python版本 3.6

01 图像灰度处理

# 使用 imread 方法直接读取灰白的图形

import cv2
img=cv2.imread('img.jpg',0)
cv2.imshow('gray image',img)
cv2.waitKey(0)
-1
# 使用cvtColor API进行转换
import cv2
img=cv2.imread('img.jpg',1)
# 颜色空间转换:第一个参数是图像对象,第二个参数是颜色转换的方式:
# 例子中颜色转换的方式是 : 从BGR转换到GRAY
new_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

cv2.imshow('gray image',new_img)
cv2.waitKey(0)
-1
# 使用灰度图像原理来实现图像的灰度处理:
#  R = G = B = Gray  Gray=(R+G+B)/3
import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
new_img=np.zeros(imageInfo,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
        new_img[i,j]=np.uint8(gray)

cv2.imshow('gray image',new_img)
cv2.waitKey(0)
-1
# 使用灰度处理算法原理进行图像灰度的处理:
#  gray =r*0.299 + g*0.587 + b* 0.114
import cv2
import numpy as np
img=cv2.imread('img.jpg',1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
new_img=np.zeros(imageInfo,np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r)=img[i,j]
        r=int(r)
        g=int(g)
        b=int(b)
        gray=r*0.299+g*0.587+b*0.114
        new_img[i,j]=np.uint8(gray)

cv2.imshow('gray image',new_img)
cv2.waitKey(0)
-1
# 算法优化
# 尽量避免使用浮点运算,用顶点运算进行替换
# 移位运算要比 加减乘除都要快
# gray=0.299*r+0.587*g+0.114*b 可以转化为: (r+g/2+b)/4 舍弃了一些精度
# 进一步优化: gray=(r+(g<<1)+b)>>2
import numpy as np
import cv2
img=cv2.imread("img.jpg",1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]
new_img=np.zeros(imageInfo,np.uint8)
for i in range(0,height):
    for j in range(0,width):
        b,g,r=img[i,j]
        r=int(r)
        g=int(g)
        b=int(b)
        gray=(r+(g<<1)+b)>>2
        new_img[i,j]=gray
cv2.imshow("image",new_img)
cv2.waitKey(0)
-1

02 图像颜色反转

# opencv 图像颜色反转
# 灰度图像颜色的反转
import cv2
import numpy as np

img=cv2.imread("img.jpg",1)
imageInfo=img.shape

width=imageInfo[1]
height=imageInfo[0]
mode=imageInfo[2]

new_img=np.zeros((height,width,1),np.uint8)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

for i in range(0,height):
    for j in range(0,width):
        temp=gray[i,j]
        new_img[i,j]=255-temp
cv2.imshow("before",img)
cv2.imshow("gray",gray)
cv2.imshow("after",new_img)
cv2.waitKey(0)
# opencv 图像反转
# 彩色图像的颜色反转
import cv2
import numpy as np

img=cv2.imread("img.jpg",1)
imageInfo=img.shape

width=imageInfo[1]
height=imageInfo[0]
mode=imageInfo[2]

new_img=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]
        new_img[i,j]=(255-b,255-g,255-r)
cv2.imshow("before",img)
cv2.imshow("after",new_img)
cv2.waitKey(0)
-1

图片马赛克效果

import cv2
img=cv2.imread("img.jpg",1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]

print(imageInfo)

#设定马赛克范围
#  x (150--->250)
#  y (280--->380)

for i in range(150,250):
    for j in range(280,380):
        # 马赛克的原理就是在一个点 取一个颜色值,然后在一定的范围之内都是这个颜色值。
        # 这里选定每 (10 x 10) 的方块为一个马赛克块。
        if i%10==0 and j%10==0:
            (b,g,r)=img[i,j]
            for row in range(10):
                for col in range(10):
                    img[row+i,j+col]=(b,g,r)
cv2.imshow("after",img)
cv2.waitKey(0)
(375, 500, 3)





-1

图片毛玻璃效果

import cv2
import random
import numpy as np
img=cv2.imread("img.jpg",1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]

new_img=np.zeros(imageInfo,np.uint8)
mm=8
for i in range(0,height-mm):
    for j in range(0,width-mm):
        index=int(random.random()*mm)
        (b,g,r)=img[i+index,j+index]
        new_img[i,j]=(b,g,r)
cv2.imshow("new image",new_img)
cv2.waitKey(0)
-1

图片融合

# 图片融合实际上就是两张图片各自保留多少透明度,然后叠加在一起形成的图片
import cv2
import numpy as np
img=cv2.imread("image.png",1)
img1=cv2.imread("img.jpg",1)

info1=img.shape
info2=img1.shape
print(info1)
print(info2)

# 定义新图像的高和宽

height=300
width=400
img_temp=img[0:height,0:width]
img_temp1=img1[0:height,0:width]
new_img=np.zeros((height-1,width-1,3),np.uint8)
new_img=cv2.addWeighted(img_temp,0.5,img_temp1,0.5,0)
cv2.imshow("image 1",img)
cv2.imshow("image 2",img1)
cv2.imshow("new image",new_img)
cv2.waitKey(0)
(678, 1464, 3)
(375, 500, 3)





-1

边缘检测

# 边缘检测实际上是图像的卷积运算
# 通过边缘检测,可以把图片明显的边缘显示出来。平滑的部分是黑色
import cv2
import random
import numpy as np
img=cv2.imread("img.jpg",1)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 滤波功能:
imgG=cv2.GaussianBlur(gray,(3,3),0)
# 调用Canny 方法实现边缘检测
new_img=cv2.Canny(img,50,50)
cv2.imshow("after",new_img)
cv2.waitKey(0)
-1

浮雕效果

import cv2
import random
import numpy as np
img=cv2.imread("img.jpg",1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

new_img=np.zeros((height,width,1),np.uint8)
for i in range(height):
    for j in range(width-1):
        grayP0=int(gray[i,j])
        grayP1=int(gray[i,j+1])
        newP=grayP0-grayP1+150
        if newP>255:
            newP=25
        if newP<0:
            newP=0
        new_img[i,j]=newP
cv2.imshow("dst",new_img)
cv2.waitKey(0)
-1

颜色映射

# 颜色增强效果,这里实现的是加强蓝色
# 使用公式  b*1.5>255? 255:b*1.5
# g*1.3>255? 255:g*1.3
import cv2
import numpy as np
img=cv2.imread("img.jpg",1)
new_img=np.zeros(img.shape,np.uint8)
imageInfo =img.shape
height=imageInfo[0]
width=imageInfo[1]

for i in range(0,height):
    for j in range(0,width):
        (b,g,r)=img[i,j]
        b=b*1.5
        g=g*1.3
        if b>255:
            b=255
        if g>255:
            g=255
        new_img[i,j]=(b,g,r)
cv2.imshow("old image",img)
cv2.imshow("new image",new_img)
cv2.waitKey(0)
-1

油画特效

# 油画特效的原理是用一个小方块中多数的灰度值表示当前块内所有的灰度值
# 用肉眼看的话直观的感觉是没有原图纹理清晰,也就是油画的特点
# 步骤: 1 图片灰度处理 2 图片灰度等级划分 3 遍历每一个块,统计出占比比较大的灰度等级 K 4 将 将原图中满足 K灰度等级的一个像素取出作为
# 目标图像的颜色值。
import cv2
import numpy as np
# 运算量比较大,要等一会才会出结果。
img=cv2.imread("img.jpg",1)
imageInfo=img.shape
height=imageInfo[0]
width=imageInfo[1]
mode=imageInfo[2]
#灰度转换
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

new_img=np.zeros((height,width,3),np.uint8)

# 这里定义方格大小为 8 x 8
# 定义灰度等级为 8 个级别 即:0-255 共 256 个,分成八个等级,每个等级32个灰度,例如 31 处于第一级,50处于第二级
for i in range(4,height-4):
    for j in range(4,width-4):
        array1=np.zeros(8,np.uint8)
        # 遍历小方块,统计方块中的灰度值
        for m in range(-4,4):
            for n in range(-4,4):
                index=int(gray[i+m,j+n]/32)
                array1[index]=array1[index]+1
        MaxLeval=array1[0]
        l=0
        for k in range(0,8):
            if MaxLeval=(l*32) and gray[i+m,j+n]<=((l+1)*32):
                    (b,g,r)=img[i+m,j+n]
        new_img[i,j]=(b,g,r)

cv2.imshow("new image",new_img)
cv2.waitKey(0)
-1

猜你喜欢

转载自blog.csdn.net/qq_38863413/article/details/88074961
今日推荐