图像的基本操作

注意:一下代码均在jyputer notebook上执行,所以换IDE可能要换一下代码。

图像

cv2.IMREAD_COLOR # 彩色图像,默认
cv2.IMREAD_GRAYSCALE # 灰度图像
  • 读取一个彩色图像

图像的基本操作
import cv2 # opencv读取的格式是BGR

 
img=cv2.imread('1.jpg') # 读取图像
 
def cv_show(name,img): # 通过一个函数来显示图像
    cv2.imshow('name',img)
    cv2.waitKey(0) #等待时间,毫秒级,0表示任意键终止
    cv2.destroyAllWindows()
 
cv_show(img,img)
View Code
  • 读取一个灰度图像

图像的基本操作
import cv2


img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) # 指定图像格式为灰度

def cv_show(name,img):
    cv2.imshow('name',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

cv_show(img,img)
View Code
  • 显示像素值

图像的基本操作
import cv2


img=cv2.imread('1.jpg')
img
View Code 图像的基本操作
array([[[162, 167, 170],
        [162, 167, 170],
        [162, 167, 170],
        ...,
        [163, 166, 170],
        [163, 166, 170],
        [163, 166, 170]],

       [[162, 167, 170],
        [162, 167, 170],
        [162, 167, 170],
        ...,
        [163, 166, 170],
        [163, 166, 170],
        [163, 166, 170]],

       [[161, 166, 169],
        [161, 166, 169],
        [161, 166, 169],
        ...,
        [162, 165, 169],
        [162, 165, 169],
        [162, 165, 169]],

       ...,

       [[194, 192, 182],
        [194, 192, 182],
        [194, 192, 182],
        ...,
        [173, 177, 182],
        [171, 175, 180],
        [171, 174, 178]],

       [[194, 192, 182],
        [194, 192, 182],
        [194, 192, 182],
        ...,
        [173, 177, 182],
        [171, 175, 180],
        [171, 174, 178]],

       [[194, 192, 182],
        [194, 192, 182],
        [194, 192, 182],
        ...,
        [173, 177, 182],
        [171, 175, 180],
        [171, 174, 178]]], dtype=uint8)
彩色图像像素值输出,三通道 图像的基本操作
array([[167, 167, 167, ..., 167, 167, 167],
       [167, 167, 167, ..., 167, 167, 167],
       [166, 166, 166, ..., 166, 166, 166],
       ...,
       [189, 189, 189, ..., 178, 176, 175],
       [189, 189, 189, ..., 178, 176, 175],
       [189, 189, 189, ..., 178, 176, 175]], dtype=uint8)
灰度图像像素值输出,单通道
  • 保存图像

cv2.imwrite('1.png',img) # 可以改变图片后缀
  • 打印图像的类型

type(img)

 numpy.ndarray 

  • 打印图像的大小

img.size

 1454418 

  • 打印图像的数据类型

img.dtype

 dtype('uint8') 

  • 打印图像的shape

img.shape

 (1358, 1071) 这是灰度图像的,如果是彩色图像,输出就是 (1358, 1071, 3) 

  • 截取部分图像数据

图像的基本操作
import cv2 as cv


img = cv.imread('1.jpg')
part = img[0:50, 0:200] # 截取图片操作
cv.imshow('img', img) # 显示原始图
cv.imshow('part_img', part) # 显示被截取图
cv.waitKey(0)
cv.destroyAllWindows()
View Code
  • 颜色通道提取

图像的基本操作
import cv2 as cv


img = cv.imread('1.jpg')
b, g, r = cv.split(img) # 将一张图片切分成三个通道
b # 显示b通道

# output
# array([[162, 162, 162, ..., 163, 163, 163],
#       [162, 162, 162, ..., 163, 163, 163],
#       [161, 161, 161, ..., 162, 162, 162],
#       ...,
#       [194, 194, 194, ..., 173, 171, 171],
#       [194, 194, 194, ..., 173, 171, 171],
#       [194, 194, 194, ..., 173, 171, 171]], dtype=uint8)
提取其中一个通道 图像的基本操作
cv.merge((b, g, r))
将三个通道合并 图像的基本操作
import cv2 as cv


img = cv.imread('1.jpg')
cur_img = img.copy() # 复制图片
cur_img[:, :, 0] = 0 # 将B通道全部设置为0
cur_img[:, :, 1] = 0 # 将G通道全部设置为0
cv.imshow('cur_img', cur_img) # 只保留R通道
cv.waitKey(0)
cv.destroyAllWindows()
只保留某个通道,并显示
  • 边界填充

图像的基本操作
import cv2 as cv
import matplotlib.pyplot as plt


img = cv.imread('2.jpg')

top_size, bottom_size, left_size, right_size = (50, 50, 50, 50) # 设置上下左右填充的长度

replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType = cv.BORDER_REPLICATE) # 填充类型为BORDER_REPLICATE,先复制img,再make,borderType可不写
reflect = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT) # 填充类型为BORDER_REFLECT
reflect_101 = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT_101) # 填充类型为BORDER_REFLECT_101
wrap = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_WRAP) # 填充类型为BORDER_WRAP
constant = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_CONSTANT, value = 0) # 填充类型为BORDER_CONSTANT,填充值为0,黑色

# plt.subplot(331):将划分成3*3九个区域,1表示图片中左上角,第一个块中
plt.subplot(331), plt.imshow(img, 'gray'), plt.title('ORIGIN')
plt.subplot(332), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(333), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(337), plt.imshow(reflect_101, 'gray'), plt.title('REFLECT_101')
plt.subplot(338), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(339), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

plt.show()
五种边界填充
  1. BORDER_REPLICATE:复制法,也就是复制最边缘的像素
  2. BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。例如:dcba|abcd|dcba
  3. BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称。例如:dcb|abcd|cba
  4. BORDER_WRAP:外包装法。例如:abcd|abcd|abcd
  5. BORDER_CONSTANT:常量法,常数值填充。

图像的基本操作

  • 数值计算

图像的基本操作
import cv2 as cv


img = cv.imread('1.jpg')
img[:5, :, 0] # 输出前第0层的前五行
先输出img的值 

 array([[162, 162, 162, ..., 163, 163, 163], [162, 162, 162, ..., 163, 163, 163], [161, 161, 161, ..., 162, 162, 162], [161, 161, 161, ..., 162, 162, 162], [161, 161, 161, ..., 162, 162, 162]], dtype=uint8) 

图像的基本操作
img2[:5, :, 0]
再输出img2的值

 array([[172, 172, 172, ..., 173, 173, 173], [172, 172, 172, ..., 173, 173, 173], [171, 171, 171, ..., 172, 172, 172], [171, 171, 171, ..., 172, 172, 172], [171, 171, 171, ..., 172, 172, 172]], dtype=uint8) 

图像的基本操作
(img + img2)[:5, :, 0] # 以第一个值为例,162+172=334,然后334%256=78,如果两数相加超过了0-255,256个值,就取余。
img,img2相加——方式1

 array([[78, 78, 78, ..., 80, 80, 80], [78, 78, 78, ..., 80, 80, 80], [76, 76, 76, ..., 78, 78, 78], [76, 76, 76, ..., 78, 78, 78], [76, 76, 76, ..., 78, 78, 78]], dtype=uint8) 

图像的基本操作
cv.add(img, img2)[:5, :, 0] # 这个函数也是相加,但是只要相加的值超过255,就取255,没有超过就取最大值
img,img2相加——方式2

 array([[255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255]], dtype=uint8) 

  • 图像融合(包含resize的使用)

图像的基本操作
import cv2 as cv
import matplotlib.pyplot as plt


cat = cv.imread('cat.jpg')
dog = cv.imread('dog.jpg')
print(cat.shape, dog.shape) # 猫的shape是(414, 500, 3),狗的shape是(429, 499, 3),明显不一样,不能融合

dog = cv.resize(dog, (500, 414)) # 将狗的shape改成和猫的一样

res = cv.addWeighted(cat, 0.4, dog, 0.6, 0) # 参考公式“R=αx+βy+b",cat是x,0.4是α,dog是y,0.6是β,0是偏置项b。
plt.subplot(131), plt.imshow(cat)
plt.subplot(132), plt.imshow(dog)
plt.subplot(133), plt.imshow(res)
融合操作

图像的基本操作

图像的基本操作
import cv2 as cv
import matplotlib.pyplot as plt


cat = cv.imread('cat.jpg')
cat1 = cv.resize(cat, (0, 0), fx = 1, fy = 3)
cat2 = cv.resize(cat, (0, 0), fx = 3, fy = 1)
plt.subplot(131), plt.imshow(cat)
plt.subplot(132), plt.imshow(cat1)
plt.subplot(133), plt.imshow(cat2)
resize的另外一种使用方式

图像的基本操作

 

 

 

读取视频

  • 读取视频并处理成灰度图像

图像的基本操作
import cv2 as cv


v = cv.VideoCapture('run.mp4')
# 检查是否打开正确
if v.isOpened():
    open, frame = v.read() # open是一个bool值,frame代表一帧一帧的读取视频
else:
    open = False
# 进行视频操作
while open:
    ret, frame = v.read()
    if frame is None:
        break
    if ret == True:
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 将每一帧转换为灰度
        cv.imshow('video', gray)
        if cv.waitKey(10) & 0xFF == 27: # cv.waitKey()里面的值可以控制播放速度,27指的是按下退出键就可以跳出循环,一般都指定27
            break
v.release()
cv.destroyAllWindows()
View Code

 

上一篇:在R语言中轻松创建关联网络


下一篇:python – 使用其他列的值填充列中的空单元格