1.认识图像(彩色图中每一个像素点都包含三个颜色通道RGB,数值范围为0~255,0代表黑色,255代表白色)
import cv2 #opencv 读取的格式为BGR
img = cv2.imread('cat.png') #读取图像
cv2.imshow('cat', img) #显示图像img,窗口名为cat
cv2.waitKey(0) #显示并停留
print(img)
print(img.shape) # h*w*c (432, 650, 3),此时有三个通道
print(len(img)) #高
print(len(img[0])) #宽
print(len(img[0][0])) #RGB
程序一旦停止运行,图片就不会展示了,所以会出现一闪而过的窗口展示,为了让图片长时间展示出来,需要加:cv2.waitKey(0)
print(img):(输出三维列表:最外维度是高,中间维度是宽,最里面的维度是RGB)
[[[ 14 24 11]
[ 14 24 11]
[ 14 24 12]
...
[ 3 26 12]
[ 3 29 13]
[ 3 30 14]]
[[ 14 24 11]
[ 14 24 11]
[ 13 23 11]
...
[ 2 25 11]
[ 3 29 13]
[ 3 30 14]]
[[ 14 24 12]
[ 14 24 12]
[ 13 23 11]
...
[ 3 23 10]
[ 5 28 13]
[ 4 30 14]]
...
[[ 38 137 121]
[ 36 135 119]
[ 36 134 118]
...
[ 35 125 106]
[ 36 125 106]
[ 36 125 106]]
[[ 39 138 122]
[ 37 136 120]
[ 37 135 119]
...
[ 35 124 105]
[ 35 124 105]
[ 35 124 105]]
[[ 40 139 123]
[ 38 137 121]
[ 38 136 120]
...
[ 35 124 105]
[ 35 124 105]
[ 35 124 105]]]
print(len(img)) & print(leg(img[0])) & print(leg(img[0][0])) & print(img.shape):
432
650
3
(432, 650, 3)
2.读取灰度图
彩色图到灰色图的转化公式:B × 0.114 + G × 0.587 + R × 0.299
例:14×0.114+24×0.587+11×0.299=18.973(向下取整)
14×0.114+24×0.587+12×0.299=19.272(向下取整)
import cv2 #opencv 读取的格式为BGR
# 读取灰度图
img = cv2.imread('cat.png', cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_GRAYSCALE表示读取灰度图
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('cat',img) #封装起来,只需传入窗口名和待显示图像
print(img.shape) # h*w (432, 650),此时只有一个通道
#图像保存,将图片img保存在当前目录,名为cat2.png
cv2.imwrite('cat2.png', img)
print(img) & print(img.shape):
[[ 18 18 19 ... 19 21 22]
[ 18 18 18 ... 18 21 22]
[ 19 19 18 ... 16 20 22]
...
[120 118 118 ... 109 109 109]
[121 119 119 ... 108 108 108]
[122 120 120 ... 108 108 108]]
(432, 650)
3.图像截取
img2 = cv2.imread('cat.png') #读取图像
img3 = img2[0:200, 0:300] #高200像素,宽300像素
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('cat',img3)
print(img3.shape) #(200, 300, 3)
3.1通道提取
img2 = cv2.imread('cat.png') #读取图像
#只保留R通道,令B,G通道都为0,其他同理
img2[:,:,0]=0
img2[:,:,1]=0
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('cat',img2)
4.图像融合
img2 = cv2.imread('cat.png') #读取图像
img3 = img2 + 10
print(img2[0:2,0:2,:]) #为了方便观察,只打印前两行两列的数值
print(img3[0:2,0:2,:])
可以看出在每个像素点的每个通道上都+10
[[[14 24 11]
[14 24 11]]
[[14 24 11]
[14 24 11]]]
[[[24 34 21]
[24 34 21]]
[[24 34 21]
[24 34 21]]]
如果大于255怎么办,会自动溢出:14+250-256=8,24+250-256=18...
img2 = cv2.imread('cat.png') #读取图像
img3 = img2 + 250
print(img2[0:2,0:2,:]) #为了方便观察,只打印前两行两列的数值
print(img3[0:2,0:2,:])
[[[14 24 11]
[14 24 11]]
[[14 24 11]
[14 24 11]]]
[[[ 8 18 5]
[ 8 18 5]]
[[ 8 18 5]
[ 8 18 5]]]
5.腐蚀与膨胀
import cv2 #opencv 读取的格式为BGR
import numpy as np
img = cv2.imread('j.png') #读取图像
kernel = np.ones((5,5), np.uint8) #设置锚框(核)大小
img2 = cv2.erode(img, kernel) #erode为腐蚀操作
img2 = cv2.dilate(img, kernel) #dilate为膨胀操作
img2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) #开运算
img2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) #闭运算
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('j', img2)
腐蚀:将锚框(核)区域中最小的值赋值给锚点,即将(0,0,0)像素值赋值给锚点,故腐蚀后黑色区域增加,白色区域减少;
膨胀:将锚框(核)区域中最大的值赋值给锚点,即将(255,255,255)像素值赋值给锚点,故膨胀后白色区域增加,黑色区域减少;
开运算:先腐蚀,再膨胀;闭运算:先膨胀,再腐蚀。
5.1梯度计算
梯度计算 = 膨胀 - 腐蚀
import cv2 #opencv 读取的格式为BGR
import numpy as np
img = cv2.imread('j.png') #读取图像
kernel = np.ones((5,5), np.uint8)
# imgP = cv2.erode(img, kernel) #膨胀
# imgF = cv2.dilate(img, kernel) #腐蚀
# img2 = imgF - imgP #膨胀-腐蚀
img2 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) #梯度运算
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('j', img2)
6.Soble算子(边缘检测)
import cv2 #opencv 读取的格式为BGR
import numpy as np
img = cv2.imread('j.png') #读取图像
imgx = cv2.Sobel(img, cv2.CV_64F, 1, 0, 3) #cv2.CV_64F为更高的数据类型,dx=1,dy=0,ksize=3
imgx = cv2.convertScaleAbs(imgx) #将负值转化为绝对值
imgy = cv2.Sobel(img, cv2.CV_64F, 0, 1, 3) #cv2.CV_64F为更高的数据类型,dx=0,dy=1,ksize=3
imgy = cv2.convertScaleAbs(imgy) #将负值转化为绝对值
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('j', imgx)
cv_show('j', imgy)
#同时在x,y方向上Soble
imgx_y = cv2.addWeighted(imgx, 0.5, imgy, 0.5, 0) #0.5为权重,0为偏置
cv_show('j', imgx_y)
Scharr算子(用法和Soble一样)
import cv2 #opencv 读取的格式为BGR
import numpy as np
img = cv2.imread('j.png') #读取图像
imgx = cv2.Scharr(img, cv2.CV_64F, 1, 0, 3) #cv2.CV_64F为更高的数据类型,dx=1,dy=0,ksize=3
imgx = cv2.convertScaleAbs(imgx) #将负值转化为绝对值
imgy = cv2.Scharr(img, cv2.CV_64F, 0, 1, 3) #cv2.CV_64F为更高的数据类型,dx=0,dy=1,ksize=3
imgy = cv2.convertScaleAbs(imgy) #将负值转化为绝对值
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('j', imgx)
cv_show('j', imgy)
#同时在x,y方向上Soble
imgx_y = cv2.addWeighted(imgx, 0.5, imgy, 0.5, 0) #0.5为权重,0为偏置
cv_show('j', imgx_y)
Laplace算子
import cv2 #opencv 读取的格式为BGR
import numpy as np
img = cv2.imread('j.png') #读取图像
img2 = cv2.Laplacian(img, cv2.CV_64F, 3) #不需要设置dx,dy
img2 = cv2.convertScaleAbs(img2)
def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像
cv2.imshow(name, img)
cv2.waitKey(0) #显示并停留
cv_show('j', img2)