A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容来自OpenCV-Python Tutorials 自己翻译整理

目标:
获取像素值并修改
获取图像属性
设定图像区域
分割和拼接图像

上面内容和python中的numpy库操作有重要联系,熟练使用numpy库很重要

获取像素值并修改
获取图像值可以通过行列的坐标获取,对于一个BGR图像则返回一个BGR值,对于一个灰度图像则返回它的灰度值

import cv2
import numpy as np

img=cv2.imread('2.jpg')
px = img[50,50]
print(px)
px = img[50,50,0]#获取blue值
print(px)
px = img[50,50,1]#获取green值
print(px)
px = img[50,50,2]#获取red值
print(px)

img[50,50] = [255,255,255]
print(img[50,50])
在处理图像的过程中,逐个点像素运算非常耗时,尽量使用矩阵运算。

上述方法通常用来选取矩阵的一个区域,对于图像中的像素处理,使用array.item() 和array.itemset()函数更好,但是返回值

import cv2
import numpy as np

img=cv2.imread('2.jpg')
print(img[10,10])
sca=img.item(10,10,0)#获取bgr值
print(sca)
sca=img.item(10,10,1)
print(sca)
sca=img.item(10,10,2)
print(sca)

img.itemset((10,10,2),100)#给像素赋值
获取图像属性
图像属性包括行数、列数、通道、图像数据类型、像素数等等

img.shape可以返回图像的基本信息

import cv2
import numpy as np

img=cv2.imread('2.jpg')
print(img.shape)

分别是行数、列数、通道数
如果是灰度图像只返回行数和列数

img.size返回图像的像素数

img.dtype返回图像的数据类型
由于python中经常出现数据不一致的情况,所以dtype函数很有用

图像ROI
有时需要找到图片中特定区域的位置,例如在图片中寻找眼睛,首先要找到人脸,然后再找眼睛

ROI是使用numpy下标获取的,此处选择球的部分并把球拷贝到另一个图片当中


复制好的结果

import cv2

import numpy as np


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

ball = img[280:340, 330:390]

img[273:333, 100:160] = ball

分割和合并图像通道

图片的BGR通道可以被分割成单个的通道,对于每个单个的通道可以合并到一起,再次组成BGR

分割
b,g,r = cv2.split(img)
或者使用python中的切片
b = img[:,:,0]#获取蓝色部分

注意split比较耗时

为图像添加边界(填充)
如果想给图片添加一个边界,类似相框一样,可以使用cv2.copyMakeBorder() 函数
但是这个功能还有更多的利用价值,例如卷积运算或者0填充等等
参数如下:

  • src - 输入图片
  • top,bottom,left,right - 边界的像素数目
  • borderType - 添加的边界类型,有如下选,cv2.BORDER_CONSTANT 添加有颜色的常量值边界,还需要增加一个参数 value; cv2.BORDER_REFLECT 边界元素镜像,例如
    fedcba|abcdefgh|hgfedcb;cv2.BORDER_REFLECT_101 或者 cv2.BORDER_DEFAULT,和上面类似, 但是有少许改变gfedcb|abcdefgh|gfedcba;cv2.BORDER_REPLICATE 重复最后一个元素,例如aaaaaa|abcdefgh|hhhhhhh;cv2.BORDER_WRAP (作者不知道怎么表达)例如cdefgh|abcdefgh|abcdefg
  • value 边界颜色,如果边界的类型是cv2.BORDER_CONSTANT

样例代码

import cv2

import matplotlib.pyplot as plt

import numpy as np



BLUE = [255,0,0]


img1 = cv2.imread('2.jpg')


replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)

reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)

reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)

wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)

constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.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()

原图:

结果如下图所示:

matplotlib绘制,顺序是RGB,蓝色和红色调换


6 个回复

倒序浏览
优秀,奈斯
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
奈斯,优秀
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马