計算機視覺之圖像特效(實現圖像灰度處理、顏色反轉、馬賽克、毛玻璃、圖片融合等功能)


1.圖像灰度處理

下面介紹四種圖像灰度處理的方法:

方法1:cv2中的imread(參數:0表示為灰度圖片,1表示為彩色圖片)

測試代碼如下:

1 import cv2
2 # 方法1 imread
3 img0 = cv2.imread('image0.jpg', 0)  # 0 為灰度圖片 1 為彩色圖片
4 img1 = cv2.imread('image0.jpg', 1)
5 print(img0.shape)
6 print(img1.shape)
7 cv2.imshow('src0',img0)
8 cv2.imshow('src1',img1)
9 cv2.waitKey(0)

運行結果如下:

src0為灰度圖像:

src1為彩色圖像:

方法 2:cvtColor

測試代碼如下:

1 # 方法2 cvtColor
2 import cv2
3 img = cv2.imread('image0.jpg', 1)
4 dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 完成顏色空間的轉換 從bgr模式轉化為灰度模式
5 cv2.imshow('dst', dst)
6 cv2.waitKey(0)

運行結果如下:

同樣的可以轉化為灰度圖像:

方法3:對RGB三個分量取均值

 1 # 方法3 RGB R=G=B gray=(R+G+B)/3
 2 import cv2
 3 import numpy as np
 4 img = cv2.imread('image0.jpg', 1)
 5 cv2.imshow('src',img)
 6 imgInfo = img.shape
 7 height = imgInfo[0]
 8 width = imgInfo[1]
 9 dst = np.zeros((height,width,3),np.uint8)
10 for i in range(0,height):
11     for j in range(0,width):
12         (b,g,r) = img[i,j]
13         gray = (int(b)+int(g)+int(r))/3  # 防止數據溢出
14         dst[i,j] = np.uint8(gray)
15 cv2.imshow('dst',dst)
16 cv2.waitKey(0)

 運行結果:略

方法4:對rbg加權 gray = r*0.299+g*0.587+b*0.114

 1 # 方法4 對rbg加權
 2 # gray = r*0.299+g*0.587+b*0.114
 3 import cv2
 4 import numpy as np
 5 img = cv2.imread('image0.jpg', 1)
 6 cv2.imshow('src',img)
 7 imgInfo = img.shape
 8 height = imgInfo[0]
 9 width = imgInfo[1]
10 dst = np.zeros((height,width,3),np.uint8)
11 w = [0.299, 0.587, 0.114]
12 for i in range(0,height):
13     for j in range(0,width):
14         (b,g,r) = img[i,j]
15         gray = r*0.299+g*0.587+b*0.114
16         dst[i,j] = np.uint8(gray)
17 cv2.imshow('dst',dst)
18 cv2.waitKey(0)

 運行結果:略

圖像轉灰度算法優化:

原因:

  • 重要
  • 基礎 
  • 實時性

優化方法:

  • 定點運算優於浮點運算
  • 減法優於乘除
  • 移位運算優於乘除

測試代碼如下:

 1 import cv2
 2 import numpy as np
 3 img = cv2.imread('image0.jpg', 1)
 4 cv2.imshow('src',img)
 5 imgInfo = img.shape
 6 height = imgInfo[0]
 7 width = imgInfo[1]
 8 dst = np.zeros((height,width,3),np.uint8)
 9 for i in range(0,height):
10     for j in range(0,width):
11         (b,g,r) = img[i,j]
12         b = int(b)
13         g = int(g)
14         r = int(r)
15         # gray = (int(b) + int(g) + int(r)) / 3  # 防止數據溢出
16         gray = (r+(g << 1)+b) >> 2  # 浮點轉化成了定點 r和b乘以1省略掉 乘除轉化為移位運算 但是會損失一點精度
17         dst[i,j] = np.uint8(gray)
18 cv2.imshow('dst',dst)
19 cv2.waitKey(0)

運行結果如下:

src為彩色的原始圖像:

dst為轉化為灰度的目標圖像:

其實可以通過算法優化的圖像對比前面四種方法處理后的圖像,可以知道,其實效果都差不多,但是性能顯著提升!

2.顏色反轉

顏色反轉分為:灰度圖的顏色反轉和RGB圖的顏色反轉,但是本質上都是一樣的,取反操作即對每個像素點進行取反得到新的像素值,或者用255-當前像素值(八位的時候)。

1.灰度圖的顏色反轉,測試代碼如下:

 1 import cv2
 2 import numpy as np
 3 img = cv2.imread('image0.jpg', 1)
 4 cv2.imshow('src',img)  # 彩色圖
 5 imgInfo = img.shape
 6 height = imgInfo[0]
 7 width = imgInfo[1]
 8 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 轉化為灰度圖
 9 cv2.imshow('gray',gray)
10 dst = np.zeros((height,width,1),np.uint8)
11 for i in range(0,height):
12     for j in range(0,width):
13         dst[i,j] = 255-gray[i,j]
14         # 也可以通過取反得到,效果是一樣的,下面一行是取反的操作,能夠實現同樣的效果
15         # dst[i,j] = ~gray[i,j]
16 cv2.imshow('dst',dst)  # 灰度圖反轉后的圖像
17 cv2.waitKey(0)

運行結果如下:(src為初始的彩色圖像,gray為轉化的灰度圖,dst為灰度圖反轉后的圖像)

src:略

gray:

dst:

2.RGB彩色圖像的反轉,測試代碼如下:

 1 # RGB 顏色反轉 [255,255,255]-當前像素值[b,g,r]
 2 import cv2
 3 import numpy as np
 4 img = cv2.imread('image0.jpg', 1)
 5 cv2.imshow('src',img)
 6 imgInfo = img.shape
 7 height = imgInfo[0]
 8 width = imgInfo[1]
 9 dst = np.zeros((height,width,3),np.uint8)
10 w = [255, 255, 255]
11 for i in range(0,height):
12     for j in range(0,width):
13         dst[i,j] = w - img[i,j]
14 cv2.imshow('dst',dst)
15 cv2.waitKey(0)

運行結果如下:

src為RGB原始圖像:

dst為RGB圖像反轉后的圖像:

 3.圖片馬賽克化

馬賽克效果:實質是在一個小矩陣范圍內隨機取一個像素進行填充(即代替矩形框中其他的像素)。

參考示例,便於理解:

圖片馬賽克化,測試代碼如下:

 1 # 馬賽克效果:實質是在一個小矩陣范圍內隨機取一個像素進行填充(即代替矩形框中其他的像素)
 2 import cv2
 3 import numpy as np
 4 img = cv2.imread('image0.jpg', 1)
 5 cv2.imshow('src',img)
 6 imgInfo = img.shape
 7 height = imgInfo[0]
 8 width = imgInfo[1]
 9 # 將圖像中從點(200,400)到點(400,600)進行馬賽克處理
10 for m in range(200,400):
11     for n in range(400,600):
12         # pixel -》10*10
13         if m%10 == 0 and n%10 == 0:
14             for i in range(0,10):
15                 for j in range(0,10):
16                     (b,g,r) = img[m,n]
17                     img[i+m,j+n]=(b,g,r)
18 cv2.imshow('dst',img)
19 cv2.waitKey(0)

運行效果如下:

src原始圖像:

dst馬賽克化后的圖像:(圖中的圈為馬賽克效果)

4.圖片毛玻璃化

毛玻璃效果:是一個隨機替換的過程,實質在一個小范圍內隨機取一個像素進行替換。

參考示例,便於理解:

圖片毛玻璃化,測試代碼如下:

 1 # 毛玻璃效果:是一個隨機替換的過程,實質在一個小范圍內隨機取一個像素進行替換
 2 import cv2
 3 import numpy as np
 4 import random
 5 img = cv2.imread('image0.jpg', 1)
 6 cv2.imshow('src',img)
 7 imgInfo = img.shape
 8 height = imgInfo[0]
 9 width = imgInfo[1]
10 dst = np.zeros((height,width,3),np.uint8)
11 mm = 8
12 # 減去mm防止越界 邊框未填充所以為0是黑色
13 for m in range(0, height-mm):
14     for n in range(0, width-mm):
15         index = int(random.random()*8)
16         (b,g,r) = img[m+index,n+index]
17         dst[m,n] = (b,g,r)
18 cv2.imshow('dst',dst)
19 cv2.waitKey(0)

運行效果如下:

dst毛玻璃化的目標圖像:

5.圖片融合

圖片融合:實質上是對多個圖像進行加權求和,生成新的圖像,不同的權值組合可以生成不同的圖像。

以兩個圖像的融合為例:dst = src1*a+src2*(1-a),亦即:目標圖像 = 第一幅圖像 * 第一幅圖像的權值 + 第二幅圖像 * 第二幅圖像的權值 。

下面是圖片融合的測試代碼:

 1 # 圖片融合:對多個圖像進行加權求和
 2 # dst = src1*a+src2*(1-a)
 3 import cv2
 4 import numpy as np
 5 img0 = cv2.imread('image0.jpg', 1)
 6 img1 = cv2.imread('image1.jpg', 1)
 7 cv2.imshow('src0',img0)
 8 cv2.imshow('src1',img1)
 9 imgInfo = img0.shape
10 height = imgInfo[0]
11 width = imgInfo[1]
12 # ROI
13 roiH = int(height/2)
14 roiW = int(width/2)
15 img0ROI = img0[0:roiH,0:roiW]
16 img1ROI = img1[0:roiH,0:roiW]
17 # dst
18 dst = np.zeros((roiH,roiW,3),np.uint8)
19 # 調用cv2的api進行圖片融合:addWeighted方法,前面四個參數分別對應pic1的信息,pic1的權重,pic2的信息,pic2的權重
20 # dst = src1*a+src2*(1-a)
21 dst = cv2.addWeighted(img0ROI,0.3,img1ROI,0.7,0)
22 cv2.imshow('dst',dst)
23 cv2.waitKey(0)

運行結果如下:

src0第一幅圖像:

src1第二幅圖像:

dst融合后的目標圖像:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM