OpenCV基础(一)

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算子(边缘检测)

Soble卷积因子
dx方向
dy方向
dx,dy合并
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一样)

scharr算子卷积因子
dx方向
dy方向
dx,dy合并
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算子

Laplace算子卷积因子
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) 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值