目录:

1 获取图像的属性    2 获取像素值并修改    3 图像ROI(region of interest)  4 拆分及合并通道    5 为图像扩边


1 获取图像的属性

img.shape

可以获取图像的形状。他的返回值是一个包含行数(高),列数(宽), 通道数的元组。

img.size

可以返回图像的像素数目

img.dtype

可以返回返回图像的数据类型

例如:

该文章原图:

imgaug python 使用 python img.shape_python

程序:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')  # 改变默认输出的标准编码

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

# 获取图像属性
shape = img.shape
print('图像的形状为: ', shape)  # 打印图像形状,包括行、列、通道
size = img.size
print('图像的像素数目为: ', size)  # 打印图像的像素数目
dtype = img.dtype
print('图像的数据类型为: ', dtype)  # 打印图像的数据类型

结果如下:

imgaug python 使用 python img.shape_cv2.copymakeborder_02

2 获取像素值并修改

参数含义

  • y:y坐标
  • x:x坐标
  • bgr:BGR通道,0:B通道,1:G通道,2:R通道

获取像素值

img[y,x]

获取(x,y)处的通道值,返回列表

img[y,x,bgr]

获取(x,y)处一个通道值,bgr表示:  0:B通道,1:G通道,2:R通道

img.item(y,x,bgr)

获取(x,y)处一个通道值,bgr表示:  0:B通道,1:G通道,2:R通道

修改像素值

img[y,x]=[b,g,r]

将一个颜色赋值给一个像素点

img.itemset((y,x,bgr),value)

将一个通道值赋值给一个像素的一个通道

例如

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')  # 改变默认输出的标准编码

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

# 获取像素值
px = img[100, 200]
print('图像(200,100)处的像素值为: ', px)

# 获取像素中的颜色值
blue = img[100, 200, 0]
print('图像(200,100)处的蓝色像素值为: ', blue)
print('图像(200,100)处的蓝色像素值为: ', img.item(100, 200, 0))

# 修改像素值
img[100, 200] = [0, 0, 0]
px = img[100, 200]
print('修改后图像(200,100)处的像素值为: ', px)
img.itemset((100, 200, 0), 128)
blue = img.item(100, 200, 0)
print('修改后图像(200,100)处的蓝色像素值为: ', blue)

cv2.imshow('modified', img)
k = cv2.waitKey(0)  # 始终检测键盘
if k == 27:  # 按ESC退出
    cv2.destroyAllWindows()

结果:

imgaug python 使用 python img.shape_python_03

3 图像ROI(region of interest)

有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是 直接在一幅图像中搜索。这样会提高程序的准确性和性能。

例如:

import cv2
import numpy as np

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

cv2.imshow('original', img)

# 选择图像的一部分并复制到图像其他地方
part = img[1:215, 131:364]  # 获取一部分
img[216:430, 1:234] = part  # 复制到图像另一个地方

cv2.imshow('modified', img)
k = cv2.waitKey(0)  # 始终检测键盘
if k == 27:  # 按ESC退出
    cv2.destroyAllWindows()

结果如下

imgaug python 使用 python img.shape_python_04

4 拆分及合并通道

imgaug python 使用 python img.shape_imgaug python 使用_05

拆分通道

cv2.split(m,mv)

  • m:  图像img
  • mv:  默认为None

b=img[:,:,bgr]

只获取图像一个通道,bgr表示:  0:B通道,1:G通道,2:R通道

合并通道

cv2.merge(mv,dst)

  • mv:输入矢量,默认None
  • dst:合并通道组成的列表,例如[b,g,r]

例如:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('test.jpg')
cv2.imshow('original', img)

# 分离颜色通道
b, g, r = cv2.split(img)
cv2.imshow('Blue', b)
cv2.imshow('Green', g)
cv2.imshow('Red', r)

# 其他方法
b1 = img[:, :, 0]  # 仅取B通道
cv2.imshow('Blue-1', b1)
b2 = cv2.imread('test.jpg')
b2[:, :, 1:3] = 0  # 将0赋值给G、R通道
cv2.imshow('Blue-2', b2)

merge = cv2.merge([b, g, r])
cv2.imshow('merge', merge)

k = cv2.waitKey(0)  # 始终检测键盘
if k == 27:  # 按ESC退出
    cv2.destroyAllWindows()

结果如下:

imgaug python 使用 python img.shape_cv2.split_06

5 为图像扩边

cv2.copyMakeBorder(src,top, bottom, left, right,borderType,value)

  • src: 输入图像 • top, bottom, left, right 对应边界的像素数目。
  • top, bottom, left, right: 对应边界的像素数目
  • borderType: 要添加那种类型的边界,类型如下

–cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。

– cv2.BORDER_REFLECT边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb

– cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba

– cv2.BORDER_REPLICATE重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh

– cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh| abcdefgh|abcdefg

  • value: 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANTl

例如:

import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255, 0, 0]

img = cv2.imread('test.jpg')
replicate = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 30, 30, 30, 30, cv2.BORDER_CONSTANT, value=BLUE)

plt.subplot(231), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(cv2.cvtColor(replicate, cv2.COLOR_BGR2RGB), 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(cv2.cvtColor(reflect, cv2.COLOR_BGR2RGB), 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(cv2.cvtColor(reflect101, cv2.COLOR_BGR2RGB), 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(cv2.cvtColor(wrap, cv2.COLOR_BGR2RGB), 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(cv2.cvtColor(constant, cv2.COLOR_BGR2RGB), 'gray'), plt.title('CONSTANT')
plt.show()

结果如下:

imgaug python 使用 python img.shape_cv2.split_07