OpenCV学习:针对图片的基本操作

---恢复内容开始---

来自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()

运行截图为:

猜你喜欢

转载自www.cnblogs.com/cquer-xjtuer-lys/p/10256239.html
今日推荐