2018.12.5 —2018.12.6计算机视觉加强之图像特效

5 篇文章 0 订阅
5 篇文章 0 订阅

01 灰度处理1

'''
# imrade
# 方法1 imread
import cv2
img0 = cv2.imread('image0.jpg',0)
img1 = cv2.imread('image0.jpg',1)
print(img0.shape)
print(img1.shape)
cv2.imshow('src',img0)
cv2.waitKey(0)
'''

# 方法2 cvtColor
import cv2
img = cv2.imread('image0.jpg',1)
dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#颜色空间转换  1:data 2:BGR ->BRAY
cv2.imshow('bray',dst)
cv2.waitKey(0)

02灰度处理2

'''
# 方法3 gray (R+G+B)/3
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B =gray
dst = 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
        dst[i,j] = np.uint8(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)
'''


# 方法4 心理学方式 gray = r*0.299+g*0.587+b*0.114
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B =gray
dst = np.zeros((height,width),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        b = int(b)
        g = int(g)
        r = int(r)
        gray = r*0.299+g*0.587+b*0.114
        dst[i,j] = np.uint8(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)

03 算法优化

# 1.灰度 最重要 2.是很多图像运算的基础 3.强调算法的实时性
# 耗时 1.定点运算(快)-> 浮点运算(慢) 2.+ -(快)-> * /(慢) 3.>>(移位)(更快)->* /(慢)
# 100 1000 10000
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B =gray
dst = np.zeros((height,width),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        (b,g,r) = img[i,j]
        b = int(b)
        g = int(g)
        r = int(r)
        #gray = (r*1+g*2+b*1)/4
        gray = (r+(g<<1)+b)>>2

        dst[i,j] = np.uint8(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)

04 图片颜色反转

'''
# 灰度图片的颜色翻转   
# 0-255 255-当前
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#颜色空间转换  1:data 2:BGR ->BRAY
dst = np.zeros((height,width),np.uint8)
for i in range(0,height):
    for j in range(0,width):
        grayPixel = gray[i,j]
        dst[i,j] = 255-grayPixel
cv2.imshow('dst',dst)
cv2.waitKey(0)
'''

# 彩色图片的颜色翻转
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = 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]
        dst[i,j] = (255-b,255-g,255-r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

05 马赛克

import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for m in range(100,300):
    for n in range(100,200):
        #pixel -> 10*10
        if m%10 == 0 and n%10 ==0:
            for i in range(0,10):
                for j in range(0,10):
                    (b,g,r) = img[m,n]
                    img[i+m,j+n] = (b,g,r)
cv2.imshow('img',img)
cv2.waitKey(0)

06 毛玻璃

import cv2
import numpy as np
import random
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
mm = 8;
for m in range(0,height-mm):
    for n in range(0,width-mm):
        index = int(random.random()*8)# 0-8
        (b,g,r) = img[m+index,n+index]
        dst[m,n] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

07 图片融合

# dst = src1*a + src2*(1-a)
import cv2
import numpy as np
img0 = cv2.imread('image0.jpg',1)
img1 = cv2.imread('image1.jpg',1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]
# ROI
roiH = int(height/2)
roiW = int(width/2)
img0ROI = img0[0:roiH,0:roiW]
img1ROI = img1[0:roiH,0:roiW]
# dst
dst = np.zeros([roiH,roiW],np.uint8)
dst = cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0) #实现的功能:add 两个权重的相加  src1*a + src2*(1-a)
#  1.src1   2.src1的a  3.src2  4.src2的a  
cv2.imshow('dst',dst)
cv2.waitKey(1000)

08边缘检侧1

import cv2
import numpy as np
import random
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)
# canny 1.gray  2.进行高斯滤波  3.canny
gray = cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
imgG = cv2.GaussianBlur(gray,(3,3),0)
dst = cv2.Canny(gray,50,50) #1:data 图片数据 2:th 门限 (图片卷积之后的值>这个值)
cv2.imshow('dst',dst)
cv2.waitKey(0)

09边缘检测2

import cv2
import numpy as np
import random
import math
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)
# sobel  1.算子模版  2.图片卷积  3.阈值判决
# sobel算子的算子模版
#  竖直方向              水平方向
# [1  2  1             [1   0  -1
#  0  0  0              2   0  -2
#  -1 -2 -1 ]           1   0  -1]  

# 计算方法 :[1 2 3 4]   [a b c d]   a*1 + b*2 + c*3 + d*4 = dst

# a:竖直方向上的梯度(竖直方向上的算子和图片进行卷积后得到的值)   
# b:水平方向上的梯度(水平方向上的算子和图片进行卷积后得到的值)
#a方 加 b方  然后开方  得到 f:浮值 与 th:判决门限  比较  如果 大于th 为边缘  如果小于  为非边缘
# sqrt[a*a+b*b] = f>th 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = np.zeros((height,width,1),np.uint8)  #1表示设置为灰度图像   3为彩色图像

for i in range(0,height-2):
    for j in range(0,width-2):
        #计算y方向上的梯度
        gy = gray[i,j]*1+gray[i,j+1]*2+gray[i,j+2]*1-gray[i+2,j]*1-gray[i+2,j+1]*2-gray[i+2,j+2]*1
        #计算x方向上的梯度
        gx = gray[i,j]+gray[i+1,j]*2+gray[i+2,j]-gray[i,j+2]-gray[i+1,j+2]*2-gray[i+2,j+2]
        #计算浮值
        grad = math.sqrt(gx*gx+gy*gy)
        #进行判决
        if grad>50:
            dst[i,j] = 255
        else:
            dst[i,j] = 0

cv2.imshow('dst',dst)
cv2.waitKey(0)

10 浮雕效果

import  cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# newP = graby0-gray1+150
dst = np.zeros((height,width,1),np.uint8)
for i in range(0,height):
    for j in range(0,width-1):
        grayP0 = int(gray[i,j])#当前像素
        grayp1 = int(gray[i,j+1])#下一个像素
        newP = grayP0-grayp1+150 #新的像素
        if newP > 255:
            newP = 255
        if newP < 0:
            newP = 0
        dst[i,j] = newP
cv2.imshow('dst',dst)
cv2.waitKey(0)

11 颜色映射

import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow("src",img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# rgb -> RGB new "颜色"
# b = b*1.5
# g = g*1.3
dst = 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 = b*1.5
        g = g*1.3
        if b>255:
            b=255
        if g>255:
            g = 255
        dst[i,j]=(b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)
# 12 油画特效
# 1:gray 彩色到灰度的转化 
# 2:将图片分割为  若干个小方块 , 统计这些小方块中  每一个  小方块的灰度值 ,比如 7*7 、 8*8  或者10*10 的小方块
# 3:将 0-255 的灰度值 划分为几个等级  ,将第二步处理的结果映射到这个范围内
#   如果划分为4段 每一段有64个灰度等级  例如 第一段0-63 第二段64-127 .。。
#  比如 第一个像素为 10 属于0-63 这一段  ,99 属于64-127这一段
# 4:count  找到每一个方块中  灰度等级最多 的每一个像素  并且求取这些像素的均值 ,完成的是灰度段中  个数的统计
# 5:dst = result  用统计出来的平均值   替代原来  的像素值  最终实现油画效果
import cv2
import numpy as np
img = cv2.imread('image00.jpg',1)
cv2.imshow("src",img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = np.zeros((height,width,3),np.uint8)
for i in range(4,height-4):
    for j in range(4,width-4):
        #array1 装载8个灰度等级里的像素个数
        array1 = np.zeros(8,np.uint8)
        #第二步 定义小方块的大小
        for m  in range(-4,4):
            for n in range(-4,4):
                #第三步 灰度等级的统计
                #p1 投影到的灰度等级段  只可能是0-7
                p1 = int(gray[i+m,j+n]/32)
                array1[p1]= array1[p1]+1  #把原来的内容+1 ,表明当前的像素值完成了累加
        #获取 array1中都低 哪一个 段内  像素值  最多
        currentMax = array1[0]
        l = 0  #记录是  哪一个段
        for k in range(0,8):
            if currentMax<array1[k]:
                currentMax = array1[k]
                l = k
        # 第四步 简化 求均值
        for m  in range(-4,4):
            for n in range(-4,4):
                # l:当前处于哪一个灰度段  32:是他的灰度等级
                if gray[i+m,j+n]>=(l*32) and gray[i+m,j+n]<=((l+1)*32):
                    (b,g,r) = img[i+m,j+n]
        dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

总结

哼哼  今天就没总结了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值