---恢复内容开始---
来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解
本文由作者翻译并进行代码验证,转载请注明出处~
官方文档请参阅:https://docs.opencv.org/4.0.1/db/d5b/tutorial_py_mouse_handling.html
运行环境:
windows 10+pycharm professional 2018.3+python 3.7.1+opencv 4.0.1
目标:
1,获取并修改图像的像素值
2,获取图像属性
3,设置ROI(Region of Interest)
4,分割、合并图像
一:获取并修改图像的像素值
读取一张彩色图---> 获取行和列的像素值。对于BGR图像,返回蓝绿红的像素的数组,对于灰度图像,返回强度值。
Numpy是一个基于python的扩展程序库,支持大量的数组与矩阵运算。
代码中:
blue = img[100,100,0]
img的后面的第三个参数分别是坐标(100,100)下的蓝绿红的像素值
代码如下:
import numpy as np import cv2 as cv img = cv.imread('C:\\Users\\xjtu\\Desktop\\roi.jpg') px = img[100,100] print( px ) # accessing only blue pixel blue = img[100,100,0] print( blue )
你也可以通过一下代码修改某个点的像素值,代码如下:
img[100,100] = [255,255,255] print( img[100,100] )
运行截图如下:
也可以通过一下代码,直接实现像素值的转化。代码是将(10,10)的红色的像素值设置为100
img.itemset((10,10,2),100)
二:获取图像属性
图像属性包括行数、列数和通道数、图像数据类型、像素数等
image.shape函数返回的是一个三元的数组,内含行数、列数和通道数
由于灰度图没有通道数,所以可以利用image.shape来判断载入的图像是彩色的还是灰度图
img.size返回的是总的像素值
img.dtype返回的是图像的数据格式
img.dtype在OpenCV-Python中很重要,因为在程序中很大一部分是因为数据格式不对引起的
import cv2 as cv
img = cv.imread('C:\\Users\\xjtu\\Desktop\\roi.jpg')
print(img.shape)
print("src_image_size",img.size)
print("src_image_datatype",img.dtype)
img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
print(img.shape)
print("gray_image_size",img.size)
print("gray_image_datatype",img.dtype)
截图如下:
三、设置ROI
有的时候,需要在图像中设置感兴趣的区域。比如针对图像中的眼部识别,首先需要识别出面部,然后再在面部中查找。这一般很精确,效率也很高。代码如下
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball
四、分割和融合图像通道
分割和融合图像通道主要是为了方便在某些情况下,需要在特定的通道的图像下工作。代码如下
b,g,r = cv.split(img) img = cv.merge((b,g,r)) b = img[:,:,0] img[:,:,2] = 0
五、制作图像边框
有的时候需要为图像设置一定的边界,可以用cv.copyMakeBorder()这个函数,但是它还有更多的卷积和0填充操作。这个函数的参数有:
src-输入图像
top,bottom,left,right-用像素值表示的对应方向的长度
borderType:主要包含以下几种
a)cv.BORDER_CONSTANT,连续的彩色的边界
b)cv.BORDER_REFLECT,边框将是边框元素的镜像反射
c)cv.BORDER_REFLECT_101或 cv.BORDER_DEFAULT,(暂时还未理解,记于0111)
d)cv.BORDER_REPLICATE , 最后一个元素被复制
e)cv.BORDER_WRAP ,(暂时还未理解,记于0111)
制作图像边框的示例代码如下:
''' @author: lys @file: make_borders_for_image.py @time: 2019/1/11 17:05 @desc:在图像上设置边界 ''' import cv2 as cv import numpy as np from matplotlib import pyplot as plt BLUE = [255,0,0] img1 = cv.imread('C:\\Users\\xjtu\\Desktop\\roi.jpg') replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE) reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT) reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101) wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP) constant= cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_CONSTANT,value=BLUE) plt.subplot(231),plt.imshow(img1,'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()
运行截图为: