openCV (一) 图像的基本操作 学习回顾记录

图像基本操作

一、图像读取

cv2.imread(img,flags)
imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:

- cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
- cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
- cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1。
- 读取的格式是 BGR
- img.shape    H、W、C
cv2.cvtColor(p1,p2)
是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式,转换格式有以下两种:

- cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式; 
- cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
import cv2 # opencv 读取格式是 BGR
import matplotlib.pyplot as plt
import numpy as np


img = cv2.imread('1.jpg')# 读取
img ,img.shape# h,w,c

图片保存
cv2.imwrite("./new_img.jpg",img)

二、图像显示

cv2.imshow('一个人',img) #显示代码
#等待时间,毫秒级别, 0 表示任意键结束
cv2.waitKey(0)
cv2.destroyAllWindows()


# 一个显示函数

def cv_show(name,img):
    cv2.imshow("name",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
cv_show("一个人",img)

在这里插入图片描述

读取灰度图像
# 读取灰度图像

img_gray = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)
img_gray,img_gray.shape  # 没有通道数了

(array([[ 27,  25,  23, ...,  68,  69,  69],
        [ 26,  25,  23, ...,  72,  69,  68],
        [ 26,  24,  22, ...,  69,  64,  61],
        ...,
        [136, 138, 141, ..., 154, 152, 150],
        [142, 144, 147, ..., 158, 154, 152],
        [151, 152, 154, ..., 153, 149, 147]], dtype=uint8), (128, 64))

在这里插入图片描述

三、视频读取

  • cv2.VideoCapture() 可以捕获摄像头,用数字来控制不同的设备,例如 0,1。
  • 如果是视频文件,直接定好路径即可。
  • cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式
  • cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式; cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
vc = cv2.VideoCapture('video.mp4')
# 检查是否打开正确

if vc.isOpened():
    oepn,frame = vc.read()
else:
    open =  False
while open:
    ret,frame = vc.read()
    if frame is None:
        break
    if ret == True:
        img = frame# 可以选择 rgb
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#可以选择播放 灰度图
        
        #cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式
        #cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式; cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
        
        cv2.imshow("result",img)
        if cv2.waitKey(30) & 0xFF ==27:
            break

vc.release()
cv2.destroyAllWindows()

四、 截取部分图像数据

img = cv2.imread('beauty.jpg')
cat = img[0:200,0:200] #截取固定大小
cv_show("cat",cat)

五、 颜色单通道提取

split( ) 分割
merge( ) 合并
#split( ) 分割
b,g,r = cv2.split(img)  

# merge() 合并
img = cv2.merge((b,g,r))
img.shape  #又变成了三通道

# 只保留 R

new_img = img.copy()
new_img[:,:,0]=0 # b,g,r   第0个就是b ,使其为 0
new_img[:,:,1]=0 # b,g,r    第1个就是g, 使其为 0
cv_show("r",new_img)

# 只保留 G

new_img = img.copy()
new_img[:,:,0]=0 # b,g,r   
new_img[:,:,2]=0 # b,g,r    
cv_show("g",new_img)

# 只保留 B

new_img = img.copy()
new_img[:,:,2]=0 # b,g,r   
new_img[:,:,1]=0 # b,g,r    
cv_show("b",new_img)

六、 边界填充

- cv2.BORDER_REPLICATE: 复制法,复制最边缘像素。
- cv2.BORDER_REFLECT:反射法, 对感兴趣的图像中的像素在两边进行复制,例如:fedcba|abcdefgh|hgfedcb
- cv2.BORDER_REFLECT_101:反射法, 以最边缘像素为轴,对称, gfedcb|abcdefgh|gfedcba
- cv2.BORDER_WRAP: 外包装法,acdefgh|abcdefgh|abcdefg
- cv2.BORDER_CONSTANT: 常量法, 常数值填充。
import cv2
import matplotlib.pyplot as plt



img = cv2.imread('beauty.jpg')

top_size,bottom_size,left_size,right_size = (300,300,300,300)

replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REPLICATE)

reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT)

reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType = cv2.BORDER_REFLECT_101)

wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType =cv2.BORDER_WRAP)

constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType =cv2.BORDER_CONSTANT,value=0)



plt.subplot(231),plt.imshow(img,"gray"),plt.title("orginal")
plt.subplot(232),plt.imshow(replicate,"gray"),plt.title("replicate")
plt.subplot(233),plt.imshow(reflect,"gray"),plt.title("reflect")
plt.subplot(234),plt.imshow(reflect101,"gray"),plt.title("reflect101")
plt.subplot(235),plt.imshow(wrap,"gray"),plt.title("wrap")
plt.subplot(236),plt.imshow(constant,"gray"),plt.title("constant")

plt.show()

在这里插入图片描述

七、 数值计算

直接相加,属于数组相加,超过255 取余数
cv2.add(),超过255  为 255
import cv2

img = cv2.imread("1.jpg")
img[:5,:,0]

#out 
array([[ 34,  32,  30,  30,  30,  28,  26,  24,  27,  22,  30,  32,  24,
         39,  76, 103,  70,  47,  35,  37,  34,  35,  49,  55,  66,  66,
         67,  66,  63,  58,  55,  54,  56,  54,  53,  51,  51,  51,  52,
         54,  58,  62,  56,  53,  62,  60,  52,  54,  53,  56,  60,  60,
         59,  58,  61,  65,  61,  64,  69,  72,  71,  70,  71,  71],
  
 

img2 = img+100  # 超过的部分 相对于 256 取余数
img2[:5,:,0]

array([[134, 132, 130, 130, 130, 128, 126, 124, 127, 122, 130, 132, 124,
        139, 176, 203, 170, 147, 135, 137, 134, 135, 149, 155, 166, 166,
        167, 166, 163, 158, 155, 154, 156, 154, 153, 151, 151, 151, 152,
        154, 158, 162, 156, 153, 162, 160, 152, 154, 153, 156, 160, 160,
        159, 158, 161, 165, 161, 164, 169, 172, 171, 170, 171, 171],
      
(img+img2)[:5,:,0]  # 超过255  取余数

#out
array([[168, 164, 160, 160, 160, 156, 152, 148, 154, 144, 160, 164, 148,
        178, 252,  50, 240, 194, 170, 174, 168, 170, 198, 210, 232, 232,
        234, 232, 226, 216, 210, 208, 212, 208, 206, 202, 202, 202, 204,
        208, 216, 224, 212, 206, 224, 220, 204, 208, 206, 212, 220, 220,
        218, 216, 222, 230, 222, 228, 238, 244, 242, 240, 242, 242],

cv2.add(img,img2)[:5,:,0]  # 到达 255  就取值 255

#out
array([[168, 164, 160, 160, 160, 156, 152, 148, 154, 144, 160, 164, 148,
        178, 252, 255, 240, 194, 170, 174, 168, 170, 198, 210, 232, 232,
        234, 232, 226, 216, 210, 208, 212, 208, 206, 202, 202, 202, 204,
        208, 216, 224, 212, 206, 224, 220, 204, 208, 206, 212, 220, 220,
        218, 216, 222, 230, 222, 228, 238, 244, 242, 240, 242, 242],

八、 图像融合

import matplotlib.pyplot as plt
import cv2
img = cv2.imread("1.jpg")
img2 = cv2.imread("2.jpg")

plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(img2)
plt.show()

在这里插入图片描述

# 如果两个图像的大小不一样没办法融合,需要先 resize 大小
img_re = cv2.resize(img,(100,100))## cv resize 图像大小
img_re2 = cv2.resize(img,(100,100))

new_img_img2 = cv2.addWeighted(img,0.5,img2,0.5,0) # k1*x+k2*x+b
plt.imshow(new_img_img2)
plt.show

在这里插入图片描述

九、 拉伸

new_img = cv2.resize(img,(0,0),fx=1,fy=3)
plt.imshow(new_img)
plt.show()

在这里插入图片描述

new_img = cv2.resize(img,(0,0),fx=3,fy=1)
plt.imshow(new_img)
plt.show()

在这里插入图片描述

插值方法
  • INTER_NEAREST - 最近邻插值法

  • INTER_LINEAR - 双线性插值法(默认)

  • INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。

  • INTER_CUBIC - 基于4x4像素邻域的3次插值法

  • INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

img_3 = cv2.resize(img, (0, 0), fx=3, fy=3, interpolation=cv2.INTER_NEAREST)
plt.imshow(img_3)

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值