opencv图像基本操作

1、获取像素值并修改、获取图像的属性(信息)、图像的 ROI( )、 图像通道的拆分及合并
  图像的属性包括:行,列,通道,图像数据类型,像素数目等

import cv2
import numpy as np 

img = cv2.imread('image/2.jpg')
#Gets and modifies pixel values获取并修改像素值
#first
px = img[100,100]
print px
blue = img[100,100,0]
print blue
#second
img[100,100] = [255,255,255]
print img[100,100]
#third
print img.item(10,10,2)
img.itemset((10,10,2),100)
print img.item(10,10,2)
#获取图像属性
print img.shape
print img.size
print img.dtype
#ROI
#eye = img[150:200,180:220]
#img[140:190,60:100] = eye
#b,g,r channl split and merge
b,g,r = cv2.split(img)
img = cv2.merge(b,g)

b = img[:,:,0]
img[:,:,0] = 0

img.shape 可以获取图像的形状,返回值是一个包含行数,列数,通道数的元组
img.size 可以返回图像的像素数目
img.dtype 返回的是图像的数据类型(注意:在除虫(debug)时 img.dtype 非常重要。因为在 OpenCVPython 代码中经常出现数据类型的不一致)
  有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中
眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是
直接在一幅图像中搜索,提高程序的准确性和性能;
  有时我们需要对 BGR 三个通道分别进行操作。这是你就需要把 BGR 拆
分成单个通道。有时你需要把独立通道的图片合并成一个 BGR 图像。
(注:merge()函数输入的参数是2个,目前不知道怎么处理3通道,会报错)
2、为图像扩边(填充)
  如果你想在图像周围创建一个边,就像相框一样,你可以使用 cv2.copyMakeBorder()
函数。这经常在卷积运算或 0 填充时被用到。这个函数包括如下参数:
• src 输入图像
• top, bottom, left, right 对应边界的像素数目。
• borderType 要添加那种类型的边界,类型如下
– cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
– cv2.BORDER_REFLECT 边界元素的镜像。比如:fedcba|abcdefgh|hgfedcb
– cv2.BORDER_REFLECT_101 or 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 numpy as np 
from matplotlib import pyplot as plt 
BLUE = [255,0,0]

img1 = cv2.imread('image/logo.jpeg')
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()

结果图:
这里写图片描述
3、图像加法
  学习图像上的算术运算,加法,减法,位运算
  OpenCV 中的加法与 Numpy 的加法是有所不同的。 OpenCV 的加法是一种饱和操作,而 Numpy 的加法是一种模操作。这种差别在你对两幅图像进行加法时会更加明显。 OpenCV 的结果会更好一点。所以我们尽量使用 OpenCV 中的函数。

x = np.uint8([250])
y = np.uint8([10])
print cv2.add(x,y) #250+10 = 260 =>255
[[255]]
print x + y #250 + 10 = 260%256 = 4
[4]

4、图像混合
  这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:

        g (x) = (1 − α) f0 (x) + αf1 (x)

通过修改 α 的值(0 ->1),可以实现非常酷的混合。
  现在我们把两幅图混合在一起。第一幅图的权重是 0.7,第二幅图的权重是 0.3。函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作。

        dst = α · img1 + β · img2 + γ (γ取0)
import cv2
import numpy as np 
img2 = cv2.imread('image/4.jpg')
img3 = cv2.imread('image/5.jpg')

dst = cv2.addWeighted(img2, 0.7, img3, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、按位运算
  包括的按位操作有: AND, OR, NOT, XOR 等,当我们提取图像的一部分,选择非矩形 ROI 时这些操作会很有用,把 OpenCV 的标志放到另一幅图像上。如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。如果他是矩形我可以象上一章那样使用 ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:

import cv2
import numpy as np 
img4 = cv2.imread('image/lufei.jpeg')
img5 = cv2.imread('image/logo.jpeg')
#put logo on top-left corner,create a ROI
rows,cols,channels = img5.shape
roi = img4[0:rows,0:cols]
#create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img5, cv2.COLOR_BGR2GRAY)
ret,mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
img4_bg = cv2.bitwise_and(roi, roi,mask = mask)
img5_fg = cv2.bitwise_and(img5, img5,mask = mask_inv)
dst1 = cv2.add(img4_bg, img5_fg)
img4[0:rows,0:cols] = dst1
cv2.imshow('res', img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果图:
这里写图片描述

参考:OpenCV-Python 中文教程 OpenCV官方教程中文版(For Python)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值