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

Posted 深度菜鸡-达闻西

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openCV 图像的基本操作 学习回顾记录相关的知识,希望对你有一定的参考价值。

图像基本操作

一、图像读取

cv2.imread( )

- cv.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰色图像
- 读取的格式是 BGR
- img.shape    H、W、C
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)

六、 边界填充

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()

  • 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

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)

以上是关于openCV 图像的基本操作 学习回顾记录的主要内容,如果未能解决你的问题,请参考以下文章

python+opencv3图像处理学习记录

python+opencv3图像处理学习记录

opencv学习记录之几何变换

树莓派 opencv学习记录DAY-2-图像绘画

opencv学习笔记opencv加载图像修改图像显示图像保存图像以及代码举例

OpenCV最详细入门-python(代码全部可以直接运行)