如何从头搭建一个搜索引擎_numpy以及openCV

来源:互联网 发布:网络摄像头原理 编辑:程序博客网 时间:2024/06/06 01:16
类别:电工导C
日期:2016年11月29日
标题:numpy以及openCV
编号:6

一.NumPy:
  1. Numpy的主要对象为均匀的多维向量,在Numpy中一个维度称为一个axes,axes的数量称为rank
    1. e.g:[[1,0,0],[0,1,2]]:rank=2,第一个axis的长度为2,第二个axis的长度为3
  2. numpy的array的类名为ndarray,主要性质:
    1. ndarray.ndim:array的rank值
    2. ndarray.shape:array的dimensions,为一个由整数构成的tuple,如[[[1,0,0],[0,1,1]],[[0,0,0],[0,0,0]]]得到的结果为(2,2,3),shape得到的tuple的length即为ndarray.ndim
    3. ndarray.size:array的元素数量,数值上等于shape的tuple的各元素的积
    4. ndarray.dtype:元素的类型
    5. ndarray.itemsize:元素所占多少bytes
    6. ndarray.data:???
  3. 创建array:
    • 从python的list和tuple来创建:
import numpy as np
a = np.array([2,3,4])
#a = np.array(1,2,3,4) #wrong!
>>>a
array([2,3,4])

b = np.array([1,2,3],[4,5,6])
>>>b
array([[1,2,3],[4,5,6]])
    • 在创建时可以指定元素的类型:
>>>c = np.array([[1,2],[3,4]], dtype = complex)
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])
    • 创建0array或者单位array
>>> np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])


>>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
array([[[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]],
       [[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]]], dtype=int16)
    • 等间距的创建:
>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange(10)
array([0,1,2,3,4,5,6,7,8,9])
     4.访问:name[i][j]

二.openCV
  • 基本操作
    • 读取一个图像
img = cv2.imread("D:\cat.jpg")
    • 创建一个窗口
cv2.namedWindow("Image")
    • 在窗口中显示图像
cv2.imshow("Image", img)
    • 最后
cv2.waitKey (0)
#使得窗口等待响应再关闭
    • 一个简单完整的例子
import cv2

img = cv2.imread("D:\\cat.jpg")
cv2.namedWindow("Image")
cv2.imshow("Image", img)
cv2.waitKey (0)
cv2.destroyAllWindows()     #最后关闭窗口
  • 创建一个新的图像
    • 使用numpy函数
emptyImage = np.zeros(img.shape, np.uint8)     #创建一个空图像
    • 获得原图像的一个拷贝
emptyImage2 = img.copy();
    • 保存图像
cv2.imwrite('地址',所保存的图像矩阵,[图像质量])
cv2.imwrite("./cat.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
cv2.imwrite("./cat2.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
  • 访问像素
img[j,i] = 255 #j,i代表行和列

#第三个参数代表通道BGR->012
img[j,i,0]= 255
img[j,i,1]= 255
img[j,i,2]= 255

  • 分离,合并通道
#使用OpenCV自带的split函数
import cv2
import numpy as np

img = cv2.imread("D:/cat.jpg")
b, g, r = cv2.split(img)     #得到一个数组
cv2.imshow("Blue", r)
cv2.imshow("Red", g)
cv2.imshow("Green", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

#使用Numpy数组
import cv2
import numpy as np

img = cv2.imread("D:/cat.jpg")

#注意要先创建一个尺寸相同的空图像
b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)

b[:,:] = img[:,:,0]
g[:,:] = img[:,:,1]
r[:,:] = img[:,:,2]

cv2.imshow("Blue", r)
cv2.imshow("Red", g)
cv2.imshow("Green", b)
cv2.waitKey(0)
cv2.destroyAllWindows()


#通道合并

#使用OpenCV自带的merge函数
merged = cv2.merge([b,g,r]) #前面分离出来的三个通道

#使用NumPy的方法
mergedByNp = np.dstack([b,g,r])
#用NumPy组合的结果不能在OpenCV中其他函数使用,因为其组合方式与OpenCV自带的不一样

#e.g
merged = cv2.merge([b,g,r])
print "Merge by OpenCV"
print merged.strides

mergedByNp = np.dstack([b,g,r])
print "Merge by NumPy "
print mergedByNp.strides

#result:
>>>Merge by OpenCV
>>>(1125, 3, 1)
>>>Merge by NumPy
>>>(1, 500, 187500)
  • 直方图的计算和显示
    • 在python中调用OpenCV的直方图计算函数为cv2.calcHist()
#函数原型:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回hist

#e.g
#coding=utf-8
import cv2
import numpy as np

image = cv2.imread("D:/histTest.jpg", 0)
hist = cv2.calcHist([image],
    [0], #使用的通道
    None, #没有使用mask
    [256], #HistSize 表示这个直方图分为多少份
    [0.0,255.0]) #直方图柱的范围表示像素值的取值范围


阅读全文
0 0
原创粉丝点击