計算機視覺加強之影象特效與線段文字繪製
阿新 • • 發佈:2018-12-28
一.影象特效介紹
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)#只能讀取到寬高資訊
-
方法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(
-
方法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