一、灰度處理
方法一:imread方法
彩色圖的顏色通道為3,即RGB;而灰度圖只有一個顏色通道。
import cv2
img0 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)
img1 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
print(img0.shape)
print(img1.shape)cv2.imshow('src',img0)#灰度圖片
cv2.waitKey(0)
結果如下:
方法二:cvtColor方法
顏色空間轉換
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
參數一:原始待轉換數據圖片
參數二:顏色轉換方式,BGR轉GRAY
import cv2
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#顏色空間轉換
cv2.imshow('dst',dst)#灰度圖片
cv2.waitKey(0)
效果圖如下:
方法三:灰度圖像==彩色圖像(R+G+B)/3
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度圖像的GBR都相等,為彩色照片的均值
dst1 = 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))/3dst1[i,j] = np.uint8(gray)cv2.imshow('dst1',dst1)#灰度圖片
cv2.waitKey(0)
效果圖如下:
方法四:灰度圖像==彩色圖像( R * 0.299+G * 0.587 + B * 0.114)
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度圖像的GBR都相等,為彩色照片的均值
dst2 = 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)*0.114+int(g)*0.587+int(r)*0.299)dst2[i,j] = np.uint8(gray)cv2.imshow('dst2',dst2)#灰度圖片
cv2.waitKey(0)
效果圖如下:
二、算法優化
1、定點計算比浮點計算快
2、加減運算比乘除運算快
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度圖像的GBR都相等,為彩色照片的均值
dst2 = 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)*0.114+int(g)*0.587+int(r)*0.299)#gray = (int(b)+int(g)*2+int(r))/4#乘4除4gray = (r+(g<<1)+b)>>2#g乘2左移一位;除以4右移兩位dst2[i,j] = np.uint8(gray)cv2.imshow('dst2',dst2)#灰度圖片
cv2.waitKey(0)
效果圖如下:
三、顏色反轉
灰度圖像顏色反轉:0-255,即:255-當前值
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度處理
dst = np.zeros((height,width,1),np.uint8)#這里只傳入一個顏色通道(height,width,1)當成灰度圖處理
for i in range(0,height):for j in range(0,width):grayPixel = gray[i,j]dst[i,j] = 255-grayPixelcv2.imshow('dst',dst)#灰度圖片
cv2.waitKey(0)
效果圖如下:
彩色圖像的顏色反轉:RGB每個顏色通道的像素值都需要被255減去
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)#(height,width,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)
效果圖如下:
四、圖片的馬賽克效果
馬賽克效果:定義馬賽克方塊,例如為10*10;將馬賽克方塊中的一個像素值去替代整個馬賽克方塊中的所有像素點
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for i in range(100,300):for j in range(100,200):if i%10 ==0 and j%10==0 :#定義一個10*10的馬賽克方塊,用馬賽克方塊中的一個去代替整個馬賽克的像素值for m in range(0,10):for n in range(0,10):(b,g,r) = img[i,j]img[m+i,n+j] = (b,g,r)cv2.imshow('dst',img)
cv2.waitKey(0)
效果圖如下:
五、圖片的毛玻璃效果
毛玻璃效果:定義毛玻璃方塊,例如為10*10;隨機生成一個像素點去依次代替毛玻璃方塊中的所有像素點
import cv2
import numpy as np
import random
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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)
效果圖如下:
六、圖片的融合效果
采用每個圖片乘以一個比例系數然后相加進行融合的方式;兩張融合的圖片的大小必須一致
cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
參數一:圖片1
參數二:圖片1對應的權值
參數三:圖片2
參數四:圖片2對應的權值
參數五:偏移量,一般默認設置為0
import cv2
import numpy as np
img0 = cv2.imread('E:\Jupyter_workspace\study\data/water.png',1)#這兩張圖片必須大于第一張圖片的一半
img1 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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,3),np.uint8)
dst = cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
效果圖如下:
七、邊緣檢測
邊緣檢測的實質就是圖像的卷積運算
調用Canny方法api實現邊緣檢測
canny邊緣檢測步驟:
1,對圖像先進行灰度處理
2,高斯濾波,除去圖像中一下噪聲的干擾
3,調用canny方法實現邊緣檢測
cv2.Canny(img,50,50)
參數一:傳入的圖片數據
參數二:如果圖片進行卷積運算之后大于該值,則認定為邊緣
import cv2
import numpy as np
import randomimg = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('img',img)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#1,轉換灰度圖像
imgG = cv2.GaussianBlur(gray,(3,3),0)#2,高斯濾波
dst = cv2.Canny(img,50,50)#3,調用Canny算法
cv2.imshow('dsr',dst)
cv2.waitKey(0)
效果圖如下:
使用sobel算子用源碼方式實現邊緣檢測
soble算子的算法原理:
1,算子的模板
水平方向模板:
1 2 1
0 0 0
-1 -2 -1
豎直方向模板:
1 0 -1
2 0 -2
1 0 -1
2,圖片卷積
矩陣卷積是矩陣對應的元素相乘然后再求和,并不是矩陣相乘!!!
例如:[1,2,3,4]為原像素,計算模板為[a,b,c,d],卷積之后結果為:dst = a1+b2+c3+d4
這個dst就是所謂的梯度,也分為水平方向gx和豎直方向gy
grad = sqrt(gxgx+gygy)
3,閾值判決
grad和閾值進行判斷
import cv2
import numpy as np
import random
import math
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉換為灰度圖
dst = np.zeros((height,width,1),np.uint8)#因為處理的是灰度圖片所以參數為1
for i in range(0,height-2):#因為矩陣是3*3的,矩陣右下角坐標為2,所以要-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]*1gx = 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] = 255else:dst[i,j] = 0
cv2.imshow('dst',dst)
cv2.waitKey(0)
效果圖如下:
八、圖片的浮雕效果
前一個像數值-后一個像數值+一個恒定的常量
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度圖的轉換
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])#因為寬度+1了,所以j需要減一,否則會造成數組越界newP = grayP0-grayP1+150if newP>255:newP=255if newP<0:newP=0dst[i,j] = newP
cv2.imshow('dst',dst)
cv2.waitKey(0)
九、顏色的映射變化改變圖片的顏色風格
偏藍風格:b1.5+g1.3
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',img)
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]b = b*1.5g = g*1.3if b>255:b=255if g>255:g=255dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)
效果圖如下:
十、圖片的油畫效果
實現步驟:
1、實現彩色到灰色照片的轉換
2、將圖片分割為若干個小方塊,統計這些小方塊中的每個像素值
3、將0-255的灰度值劃分為若干個等級,再把每個像素值映射到這些等級中
4、找到每個等級中含有像素最多的等級,并且求取這些像素的均值;從而實現每個小方塊中像素個數的統計
5、用統計出來的平均值來替代原來的像素值,最終實現油畫效果
import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',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):#因為下面的循環是定義的小方塊大小為8*8for j in range(4,width-4):array1 = np.zeros(8,np.uint8)#定義的灰度等級為8個,這里定義一個數組裝載這8個等級for m in range(-4,4):for n in range(-4,4): p1 = int(gray[i+m,j+n]/32)array1[p1] = array1[p1]+1currentMax = array1[0]l = 0for 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):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)
效果圖如下: