首先需要读取一幅彩色图像,我们知道一幅图像可以看做一个三维矩阵,所以可以通过列表访问图像一个像素点。
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('MyPic.jpg') #读取一幅图像
px=img[100,100] #读取像素点
print (px)
blue=img[100,100,0] #读取该点B值
print (blue)
img[100,100] = [0,0,0] #修改像素
print (img[100,100])
打印结果:
[255 255 255]
255
[0 0 0]
为了更快的操作我们可以调用 numpy 软件包里面的方法:
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('MyPic.jpg') #读取一幅图像
px=img.item(100,100,0) #读取像素
print (px)
img.itemset((100,100,0),66)#修改像素点
px=img.item(100,100,0) #读取像素
print (px)
打印结果:
255
66
图像的属性包括:行,列,通道,图像数据类型,像素数目等。
img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数,通道数的元组。
img.size 可以返回图像的像素数目。
img.dtype 返回的是图像的数据类型。
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('MyPic.jpg') #读取一幅图像
print(img.shape)#打印图像形状
print(img.size)#打印图像大小
print(img.dtype)#打印图像数据类型
打印结果:
(739, 600, 3)
1330200
uint8
机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。
ROI可以通过 Numpy 索引 获得。
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('img1.PNG') #读取一幅图像
ROI = img[100:150,0:50] #获取ROI区域
img[100:150,300:350] = ROI #进行修改
cv2.imwrite('img2.PNG',img)#图像写入
为了实现图像通道的拆分可以使用split()方法,而为了进行合并可以使用merge()方法。
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('img1.PNG') #读取一幅图像
b,g,r=cv2.split(img) #图像拆分
img=cv2.merge(b,g,r) #图像组合 版本低的话只允许传入两个参数
cv2.imwrite('img2.PNG',img)#图像写入
同样,也可以使用 numpy 中的索引进行:
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('img1.PNG') #读取一幅图像
img[:,:,1]= 0 #索引修改全图像素G为0
cv2.imwrite('img2.PNG',img)#图像写入
给图像添加边界:
cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)
src: 源图像
top,bottem,left,right: 分别表示四个方向上边界的长度
borderType: 边界的类型
边界类型包括以下几种:
BORDER_REFLICATE # 重复最后一个元素, aaaaaa | abcdefg | gggg
BORDER_REFLECT # 镜像,abcdefg | gfedcbamn | nmabcd
BORDER_REFLECT_101 #和上面类似,会把边界空开,abcdefg | egfedcbamne | nmabcd
BORDER_WRAP # 类似于这种方式abcdf | mmabcdf | mmabcd
BORDER_CONSTANT # 添加有颜色的常数值边界,还需要下一个参数(value)。
#像素操作基础
import cv2
import numpy as np
img=cv2.imread('MyPic.jpg') #读取一幅图像
img1 = cv2.copyMakeBorder(img,30,30,30,30,cv2.BORDER_REFLECT)
cv2.imwrite('MyPic2.jpg',img1)#图像写入