OpenCV计算机视觉实战(Python)-02-图像的基本操作

数据读取-图像

  • cv2.IMREAD_COLOR:彩色图像
  • cv2.IMREAD_GRAYSCALE:灰度图像
import  cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

img=cv2.imread("D:/WeChat.picture/cat.jpg")

%matplotlib inline 这一句代码

官方的定义是: IPython有一组预先定义好的所谓的魔法函数(Magic Functions), 你可以通过命令行的语法形式来访问它们。

可见“%matplotlib inline”就是模仿命令行来访问magic函数的在IPython中独有的形式。

其作用就是在你调用plot()进行画图或者直接输入Figure的实例对象的时候,会自动的显示并把figure嵌入到console中。 如果不加上%maplotlib inline 的话,每次figure的显示都需要plt.show();

图像一些简单操作

图像尺寸的计算

cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img.shape #(h w c)

图像灰度化

img =cv2.imread("D:/WeChat.picture/cat.jpg",cv2.IMREAD_GRAYSCALE)
img
def cv_show(name,img):  #name 即运行窗口的名字  
  cv2.imshow('mane',img)   #img = cv2_imread("图片路径",cv2.IMREAD_彩色(COLOR)还是灰色(GRAYSCALE))
  cv2.waitKey(0)          #等待时间 毫秒级 
  cv2.destroyAllWindows()  #按任意键停止

图像显示和保存

cv2.imshow("image",img)
cv2.waitKey(0)     # 等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()

# 保存
cv2.imwrite("D:/WeChat.picture/N0.1.png",img) 

图像类型

img.dtype #数据类型 uint8的范围为 (0,255)

图像大小

img.size #像素点大小

图像类型

type(img)

数据读取-视频

vc= cv2.VideoCapture("D:/WeChat.picture/ocean.mp4")
# 检查文件是正常打开
if vc.isOpened():  #注意大小写 如isopened 则错误
    open, frame = vc.read()
else:
    open = False
while open:
    ret,no = vc.read()
    if no is None:
        break
    if ret == True:
        gray = cv2.cvtColor(no, cv2.IMREAD_COLOR)  # or  v2.cvtColor(frame, cv2.COLOR_BGR2SGRAY)
        cv2.imshow("result",gray)
        if cv2.waitKey(50) & 0xFF ==27: # &0xFF == 27 表示按Esc键退出 即break
            break
vc.release()
cv2.destroyAllWindows()

截取部分像素数据

img = cv2.imread("D:/WeChat.picture/game.jpg")  #ypeError:“NoneType”对象不可订阅  少了个 .
pic = img [200:300,200:400]
cv2.imshow("pic",pic)      # cv2.imshow("pic")  mShow()缺少所需的参数
cv2.waitKey(10000)        # cv2.waitKey(x)  x 表示停留时间 , x = 0 表示∞ 
cv2.destroyAllWindows()

颜色通道提取

img = cv2.imread("D:/WeChat.picture/game.jpg")
b,g,r = cv2.split(img) #顺序  b g r 

#b ,g ,r = img[:,:,0] ,img[:,:,1] , img[:, :, 2]

颜色通道合并

#合并
img = cv2.merge((b,g,r))  # :Bad argument
img.shape # 图片的高度 以及 宽度等

只保留某个通道

#只保留某一个通道  b g r 分别对应的数字为 0 1 2 
cur_img = img.copy()
cur_img [:,:,0] = 0
cur_img [:,:,2] = 0
cv_show("B",cur_img)

边界填充 cv2.copyMakeBorder

import cv2
img = cv2.imread("D:/WeChat.picture/cat.jpg")
top_size ,bottom_size,left_size,right_size = (50,50,50,50)

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,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size,bottom_size, left_size, right_size,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img , top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT,value = 0) # 0 表示黑色

import matplotlib.pyplot as plt
plt.subplot(231), plt.imshow(img,"gray"), plt.title("ORIGINAL")
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("REfLECT_101")
plt.subplot(235), plt.imshow(wrap, "gray"), plt.title("WRAP")
plt.subplot(236), plt.imshow(constant, "gray"), plt.title("CONSTANT")

plt.show()

OpenCV计算机视觉实战(Python)-02-图像的基本操作_第1张图片

五种方法详解如下

  • BORDER_REPLICATE:复制法,也就是复制最边缘像素。
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
  • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
  • BORDER_CONSTANT:常量法,常数值填充。

数值计算¶

img_scenery = cv2.imread("D:/WeChat.picture/scenery.jpg")
img_yuan = cv2.imread("D:/WeChat.picture/yuan.png")
img_scenery.shape, img_yuan.shape

图像融合

size必须一致

注意 在OpenCV中,img.shape[0]得到的是图片的高,img.shape[1]得到是图片的宽, 可是在cv2.resize(img, (dimension[0], dimension[1]))函数里,dimension[0]却是新图片 的宽,dimension[1]是新图

img_yuan = cv2.resize(img_yuan,(2280,1080))  # 应该注意 高度 于 宽度 的顺序
img_yuan.shape

res = img_yuan + img_scenery
plt.imshow(res)
plt.show()

OpenCV计算机视觉实战(Python)-02-图像的基本操作_第2张图片

res = cv2.resize(img_yuan,(0,0), fx=1, fy=1.5)  #   此时的图片大小 已经进行了此操作 img_yuan = cv2.resize(img_yuan,(2280,1080))
plt.imshow(res)
plt.show()

 OpenCV计算机视觉实战(Python)-02-图像的基本操作_第3张图片

# R = αA + βB + c (c 为偏知项,在亮度级上微调 ,α拟A的权重) 
# 融合不是简单 的相加
res = cv2.addWeighted(img_yuan,0.4,img_scenery,0.6,12)
plt.imshow(res)
plt.show()

你可能感兴趣的:(python)