看到core,心里不禁一惊。而实际上,此系列简单介绍了,图像的像素提取,ROI区域提取,图像的通道的合并分离、图像的合并等几个操作,及衡量程序的时间接口,及性能相关的SSE2指令的简单介绍。
或许本身就是这些简单的操作构成了后续图像的复杂运算吧。
图像的基本操作
1. 提取修改 像素
读取图像后,直接用像素的行 、列坐标值来获取B G R三种颜色的值;对于grayscale ,仅仅返回intensity.
>>> px = img[100,100]
>>> print px
[157 166 200]
# accessing only blue pixel
>>> blue = img[100,100,0]
>>> print blue
157
img[row,column,channel] 的含义为row 行,column列,channel通道上的值;channel的取值 0:Blue ;1 : Green ;2 :Red
修改像素:
>>> img[100,100] = [255,255,255]
>>> print img[100,100]
[255 255 255]
上面这个直接用数组操作的方式,效率很低下,不推荐使用。numpy提供了优化的接口
img.item 和itemset两个接口
# accessing RED value
>>> img.item(10,10,2)
59
# modifying RED value
>>> img.itemset((10,10,2),100)
>>> img.item(10,10,2)
100
访问图像属性
>>> print img.shape
(342, 548, 3)
>>> print img.size
562248
>>> print img.dtype
uint8
1) shape 返回 行、列和通道数目的数组
2)如果图像是grayscale的,shape属性仅仅返回行、列信息。以此可以判断图像是彩色的还是grayscale的。
3)dtype 图像 的数据类型,在debug时非常有用。由于经常会存在类型不匹配导致的各种错误
获取ROI
通过Numpy 提供的索引方法来操作。
>>> ball = img[280:340, 330:390]
>>> img[273:333, 100:160] = ball
[280:340] 为垂直方向的区域,即包含从280-340的行;
330:390 即为列区域,即从330-390的列
这种方法只适合rectangular 的ROI
分离、合并图像通道
>>> b,g,r = cv2.split(img)
>>> img = cv2.merge((b,g,r))
Or Numpy index方法:
>>> b = img[:,:,0]
>>> img[:,:,2] = 0
split方法耗时,建议采用Numpy index方法
图像上进行数值运算
图像加法
一种是opencv的运算,为饱和(saturated)运算,即两个运算数相加,如果和超过运算数类型的最大,则两数的和为运算类型的最大值
一种是Numpy的运算,为模(modulo)运算,即两个运算数相加,如果和超过运算类型的最大值,则两数和对最大值取模为实际的和值。
对于图像运算来讲,opencv的运算方式更符合要求。
实例如下,两个8位的无符号数运算:
>>> 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]
图像混合
addWeighted函数的运算公式为:
img1 = cv2.imread('ml.png')
img2 = cv2.imread('opencv_logo.jpg')
dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像按位运算
包括 与 、或、非、与非运算。这几种运算广泛应用于提取图像某一区域,处理non-rectangular