1.圖像邊緣檢測
圖像的邊緣檢測:實質是對圖像進行卷積運算。
實現canny邊緣檢測步驟:
- 轉換為灰度圖
- 進行高斯濾波
- canny方法實現邊緣檢測
調用api實現canny邊緣檢測,測試代碼如下:
1 import cv2 2 import numpy as np 3 import random 4 img = cv2.imread('image0.jpg', 1) 5 imgInfo = img.shape 6 height = imgInfo[0] 7 width = imgInfo[1] 8 cv2.imshow('src',img) 9 # 轉化為灰度圖 10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 11 # 高斯濾波 模板大小為3*3 12 imgG = cv2.GaussianBlur(gray,(3,3),0) 13 # 調用canny方法 設置門限 大於門限則為邊緣點 14 dst = cv2.Canny(img,50,50) 15 cv2.imshow('dst',dst) 16 cv2.waitKey(0)
運行結果如下:
src為原始圖像:
dst為邊緣檢測處理后的圖像:
手動實現圖像邊緣檢測算法,以及相應的優化,測試代碼如下:
1 import cv2 2 import numpy as np 3 import random 4 import math 5 img = cv2.imread('image2.jpg', 1) 6 imgInfo = img.shape 7 height = imgInfo[0] 8 width = imgInfo[1] 9 cv2.imshow('src',img) 10 # sobel 11 # 1 算子模板 第一個為y方向上的 第二個為x方向的 12 # [ 1 2 1 [1 0 -1] 13 # 0 0 0 2 0 -2 14 # -1 -2 -1] 1 0 -1] 15 # 2 圖片卷積 16 # [1 2 3 4][a b c d] a*1+b*2+c*3+d*4 = dst 17 # 3 閾值判決 18 # sqrt(a*a+b*b) = f>th 19 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 20 dst = np.zeros((height,width,1),np.uint8) 21 for i in range(0,height-2): 22 for j in range(0,width-2): 23 # y方向上的梯度 24 # 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 25 # 優化 y方向上的梯度 26 gy = gray[i,j]+(gray[i,j+1]<<1)+gray[i,j+2]-gray[i+2,j]-(gray[i+2,j+1]<<1)-gray[i+2,j+2] 27 # x方向上的梯度 28 # gx = gray[i,j]*1+gray[i+1,j]*2+gray[i+2,j]*1-gray[i,j+2]*1-gray[i+1,j+2]*2-gray[i+2,j+2]*1 29 # 優化 x方向上的梯度 30 gx = gray[i,j]+(gray[i+1,j]<<1)+gray[i+2,j]-gray[i,j+2]-(gray[i+1,j+2]<<1)-gray[i+2,j+2] 31 # 梯度 32 grad = math.sqrt(int(gx*gx+gy*gy)) 33 # 判斷是否超過閾值 34 if grad > 50: 35 dst[i,j] = 255 36 else: 37 dst[i,j] = 0 38 cv2.imshow('dst',dst) 39 cv2.waitKey(0)
運行結果如下:
src為初始圖像:
dst為邊緣檢測處理后的圖像:
2.浮雕效果
浮雕效果:newP = gray0-gray1+150(特定值) 即當前像素等於相鄰像素之差再加上一個特定值突出灰度 即邊緣特征,設定不同的特征值的時候會出現不同的浮雕效果。
測試代碼如下:
1 import cv2 2 import numpy as np 3 import random 4 img = cv2.imread('image0.jpg', 1) 5 imgInfo = img.shape 6 height = imgInfo[0] 7 width = imgInfo[1] 8 cv2.imshow('src',img) 9 # 轉化為灰度圖 10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 11 dst = np.zeros((height,width,1),np.uint8) 12 for i in range(0,height): 13 for j in range(0,width-1): 14 grayP0 = int(gray[i,j]) 15 grayP1 = int(gray[i,j+1]) 16 newP = grayP0-grayP1+50 17 if newP > 255: 18 newP = 255 19 if newP < 0: 20 newP = 0 21 dst[i,j] = newP 22 cv2.imshow('dst',dst) 23 cv2.waitKey(0)
運行結果如下:
src初始圖像:
dst浮雕效果圖像:(特定值為150的時候)
dst浮雕效果圖像:(特定值為50的時候)
3.顏色映射
顏色映射按照我的理解就是一個顏色對應上另一個顏色,比如藍色對應紅色,那么一副純藍色的圖像就會被映射為一副純紅色的圖像。
顏色映射的實現方法:可以建立一張顏色映射表,另外一種簡單的方法是對rgb分別乘上一個系數,以下面實現一個“藍色效果”為例,b=b*1.5 g=g*1.3 r=r,測試代碼如下:
1 import cv2 2 import numpy as np 3 import random 4 img = cv2.imread('image0.jpg', 1) 5 imgInfo = img.shape 6 height = imgInfo[0] 7 width = imgInfo[1] 8 cv2.imshow('src',img) 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 b = b * 1.5 14 g = g * 1.3 15 # 防止越界操作 16 if b > 255: 17 b = 255 18 if g > 255: 19 g = 255 20 dst[i,j] = (b,g,r) 21 cv2.imshow('dst',dst) 22 cv2.waitKey(0)
運行結果如下:
src為初始圖像:
dst為藍色效果圖像:
4.油畫特效
油畫特效
1 gray
2 統計方塊中的灰度值
3 對灰度值進行分段
4 對灰度值取平均作為結果
測試代碼如下:
1 import cv2 2 import numpy as np 3 import random 4 img = cv2.imread('Jerry.jpg', 1) 5 imgInfo = img.shape 6 height = imgInfo[0] 7 width = imgInfo[1] 8 cv2.imshow('src',img) 9 # 灰度化 10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 11 dst = np.zeros((height,width,3),np.uint8) 12 for i in range(4,height-4): 13 for j in range(4,width-4): 14 array1 = np.zeros(8,np.uint8) 15 for m in range(-4,4): 16 for n in range(-4,4): 17 p1 = int(gray[i+m,j+n]/32) 18 array1[p1] = array1[p1]+1 19 currentMax = array1[0] 20 l = 0 21 for k in range(0,8): 22 if currentMax < array1[k]: 23 currentMax = array1[k] 24 l=k 25 for m in range(-4,4): 26 for n in range(-4,4): 27 if gray[i+m,j+n] >= (l*32) and gray[i+m,j+n] <= ((l+1)*32): 28 (b,g,r) = img[i+m,j+n] 29 dst[i,j] = (b,g,r) 30 cv2.imshow('Jerry',dst) 31 cv2.waitKey(0)
運行結果如下:
src為原始圖像:
Jerry是處理后的圖像: