1. 程式人生 > >計算機視覺加強之影象特效與線段文字繪製

計算機視覺加強之影象特效與線段文字繪製

一.影象特效介紹

1.灰度處理:彩色圖片灰度化

  • 對於彩色圖片有三個顏色通道:RGB
  • 對於灰度圖片如果也是三個顏色通道,則RGB值是相等的

2.底板效果(灰度)

  • 彩色底板是通過當前RGB取反得到的

3.馬賽克效果

  • 將周邊的畫素點用同一個畫素點取代

4.毛玻璃效果

  • 將畫素用隨機畫素來替代

5.顏色對映

  • 利用RBG表進行顏色統一對映

6.邊緣檢測

  • 卷積運算

7.浮雕效果

  • 在邊緣檢測上新增底板

二.影象灰度處理

1.開發思路

  • 方法1:使用imread方法實現顏色直接轉換處理
  • 方法2:使用cvtColor方法實現顏色轉換
  • 方法3:原始碼實現影象灰度處理
    • 灰度影象R=G=B
  • 方法4:心理學計算公式實現影象灰度處理
    • gray = r*0.299+g*0.587+b*0.114

2.例項程式碼

  • 方法1例項程式碼

    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例項程式碼

    import cv2
    img = cv2.imread('image0.png',1)
    dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#完成顏色空間轉換,引數:原始待轉換圖片的資料,顏色轉換的方式
    cv2.imshow('src',dst)
    cv2.waitKey(0)
    
  • 方法3實現程式碼

    import cv2
    import numpy as np
    img = cv2.imread(
    'image0.png',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] #RGB R=G=B Gray (R+G+B)/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] gray = (int(b)+int(g)+int(r))/3 dst[i,j] = np.uint8(gray) cv2.imshow('dst',dst) cv2.waitKey(0)
  • 方法4實現程式碼

    import cv2
    import numpy as np
    img = cv2.imread('image0.png',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    #RGB R=G=B Gray (R+G+B)/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 = 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)
    

3.灰度演算法優化

  • 灰度影象是所有影象特效的基礎
  • 灰度影象強調演算法的實時性
  • 演算法優化原則:定點運算時間 < 浮點運算時間 移位運算時間 < 加減運算時間 < 乘除運算時間
  • 優化r*0.299+g*0.587+b*0.114公式
    • 浮點轉定點int(x)
    • gray = (r*1+g*2+b*1)/4相當於先左移兩位,再右移兩位【肯定有誤差的】
    • 進一步優化gray = (r+(g<<1)+b)>>2,將浮點運算變成定點運算後,將乘除運算程式設計移位運算

4.例項程式碼

import cv2
import numpy as np
img = cv2.imread('image0.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#RGB R=G=B Gray (R+G+B)/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 = int(b)
        g = int(g)
        r = int(r)
        gray = (r+(g<<1)+b)>>2#左移乘,右移除
        dst[i,j] = np.uint8(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)

三.顏色反轉

1.開發思路

  • 灰度圖片顏色反轉:對於灰度圖片取值範圍是0-255,顏色反轉是255-當前灰度值
  • 彩色圖片顏色反轉:對於RGB有3個通道,每一個畫素值都是255-當前的畫素值(如R=255-R,G=255-G,B=255-B)

2.例項程式碼

  • 灰度圖片顏色反轉例項程式碼

    import cv2
    import numpy as np
    img = cv2.imread('image0.png',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    gary = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    dst = np.zeros((height,width,3),np.uint8)#其中3表示的是一個畫素由幾種顏色構成,彩色為3,灰色為1
    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.png',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    dst = np.zeros((height,width,3),np.uint8)#其中3表示的是一個畫素由幾種顏色構成,彩色為3,灰色為1
    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)
    

四.馬賽克效果

1.開發設計

  • 馬賽克效果的窗體範圍:如行100-300,列100-200
  • 每一個馬賽克都有一個小視窗,有矩形的馬賽克(10*10),也有圓形的馬賽克【本例中使用矩形的馬賽克】
  • 使用10*10畫素塊中左上角的畫素替換畫素塊中所有的畫素

2.例項程式碼

import cv2
import numpy as np
img = cv2.imread('image0.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for m in range(100,300):
    for n in range(100,200):
        #選中一個元素,替換調10*10中所有的畫素點,讓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('dst',img)
cv2.waitKey(0)

五.毛玻璃

1.開發設計

  • 毛玻璃的思想與馬賽克一致,但不是使用固定畫素進行畫素的替換,而是使用隨機的畫素替換畫素塊中的內容

2.例項程式碼

import cv2
import numpy as np
import random
img = cv2.imread('image0.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
mm = 8#設定隨機數的範圍在水平和垂直上均為8,即8*8的畫素塊中取隨機畫素
for m in range(0,height-mm):
	for n in range(0,width-mm):
        index = int(random.random()*8)#random.random()生成的隨機數是0-1,*8後,隨機數的範圍就是0-8
        (b,g,r) = img[m+index,n+index]
        dst[m,n] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

3.注意事項

  • 最右側和最下側都會有8個黑色區域,是因為垂直和水平方向各減去了8,預設填充為0,即為黑色區域

六.圖片融合

1.開發設計

  • 目標圖片=src1*a係數+src2*(1-a係數)

2.例項程式碼

import cv2
import numpy as np
img0 = cv2.imread('image0.png',1)#讀取圖片1
img1 = cv2.imread('image1.png',1)#讀取圖片2
imgInfo = img0.shape#因為圖片1和2的寬高一樣,通過此處獲得圖片的寬高資訊
height = imgInfo[0]
width = imgInfo[1]
#ROI感興趣範圍(即將原圖扣除一部分,此部分的寬度為源高度的1/2,高度為源高度的1/2)
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,3),np.uint8)
dst = cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)#第一個圖片的權重和第二個圖片的權重都是0.5。實現的是權重的計算:目標圖片=src1*a係數+src2*(1-a係數)。
#引數1:src1,引數2:src1權重,引數3:src2,引數4:src2權重
cv2.imshow('dst',dst)
cv2.waitKey(0)

七.邊緣檢測

1.開發設計

  • 完成影象的灰度處理,基於灰度影象的(將彩色圖片轉換成灰度圖片)
  • 執行高斯濾波,去除噪聲的干擾
  • 呼叫opencv中的canny方法實現邊緣檢測

2.例項程式碼

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)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度影象處理
imgG = cv2.GaussianBlur(gray,(3,3),0)#實現高斯濾波,引數1:灰度影象資料;引數2:模板大小
dst = cv2.Canny(img,50,50)#引數1:傳遞圖片的資料,引數2:門限值(如果圖片經過卷積之後的值大於這個門限,則預設為邊緣點,否則則視為非邊緣點)
cv2.imshow('dst',dst)
cv2.waitKey(0)

在這裡插入圖片描述

3.原始碼實現sobel演算法

  • 演算法原理

    • 運算元模板【分水平方向和豎直方向】

      #矩陣1
      [1  2  1
       0  0  0
       -1 -2 -1]
      #矩陣2
      [1  0  -1
       2  0  -2
       1  0  -1]
      
    • 圖片卷積【不是矩陣行列式計算,是矩陣中的數值對應相乘得到的結果】

      #eg
      #源模板[1 2 3 4]
      #運算元模板[a b c d]
      #結果a*1+b*2+c*3+d*4 = dst 結果稱之為梯度,有水平方向和豎直方向兩種情況
      
    • 閾值判決

      #運算元模板1(豎直方向上的運算元)與垂直方向上的圖片進行卷積之後得到的結果為a,稱為豎直上的梯度
      #運算元模板2(水平方向上的運算元)與水平方向上的圖片進行卷積之後得到的結果為b,稱為水平上的梯度
      #f值為sqrt(a*a+b*b),與門限進行判決,如果>判決門限則為邊緣;如果<判決門限則為非邊緣
      
  • 例項程式碼

    import cv2
    import numpy as np
    import math
    img = cv2.imread('image1.jpg',1)#讀取圖片1
    imgInfo = img.shape#因為圖片1和2的寬高一樣,通過此處獲得圖片的寬高資訊
    height = imgInfo[0]
    width = imgInfo[1]
    cv2.imshow('src',img)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    dst = np.zeros((height,width,1),np.uint8)
    for i in range(0,height-2):#卷積運算的時候會從左上角[1,1]的位置開始,單位是3*3,所以需要height-2
        for j in range(0,width-2):
            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
            gx = gray[i,j]*1-gray[i,j+2]*1+gray[i+1,j]*2-gray[i+1,j+2]*2+gray[i+2,j]*1-gray[i+2,j+2]*1
            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)
    

在這裡插入圖片描述

八.浮雕效果

1.開發設計

  • 浮雕效果也是計算梯度
    • 浮雕效果的計算公式新畫素值=gray0-gray1+150,相鄰畫素之差加上固定值

2.例項程式碼

import cv2
import numpy as np
img = cv2.imread('image1.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#newP = gray0-gray1+150
dst = np.zeros((height,width,1),np.uint8)
for i in range(0,height):
    for j in range(0,width-1):
        grapP0 = 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)

在這裡插入圖片描述

九.顏色對映

1.開發思路

  • 通過查詢表將原始RGB值替換成新的RGB值
  • 增加藍色系的模擬變換公式:b=b*1.5,g=g*1.3

2.例項程式碼

import cv2
import numpy as np
img = cv2.imread('image1.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)
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)

在這裡插入圖片描述

十.油畫特效

1.開發思路

  • 完成彩色圖片到灰度圖片的轉換
  • 將圖片分割為若干個小方塊,統計每個小方塊中畫素的灰度值
  • 將0-255的灰度值劃分為幾個等級,並把第二部處理的結果對映到這個範圍內
  • 找到每個方塊中灰度等級最多的畫素(灰度段中畫素的個數統計),並求取畫素的均值
  • 用統計出來的平均值替換原來的畫素值

2.例項程式碼

import cv2
import numpy as np
img = cv2.imread('image1.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)
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 = np.zeros(8,np.uint8)
        for m in range(-4