python opencv入门 基本图像操作(6)

内容来自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,蓝色和红色调换

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值