Python调用OpenCV像素操作

Python调用OpenCV进行操作的时候基本上感觉就是对numpy进行操作,跟numpy是挺相关的。

1、像素操作

OpenCV获取图像(x,y)处的像素值:

px=img[x,y]

当图像是三通道的时候返回的是BGR三通道的值,如果是灰度图的话就返回一个亮度值

同样的如果要对图像(x,y)处赋值的话,也通过这种方式来实现:

#三通道
img[x,y]=[255,255,255]
#单通道
img[x,y]=255

2、获取图像属性

获取图像的形式,这个跟numpy的操作基本一样,通过shape来获取:

img.shape

会返回一个图像的形态,也就是(行,列,通道),OpenCV的图像还有一个size属性,这个返回的是总的像素数量行*列*通道数。

通过图像的dtype来获取图像的像素数据类型:

img.dtype

返回的值类型如uint8等

3、图像ROI

OpenCV获取图像的ROI的时候可以使用类似numpy的方式来获取,如:

roi=img[r0:r1,c0:c1]

4、通道分离和合并

通道分离使用的是函数split:

b,g,r=cv2.split(img)

通道分离用的是merge函数:

img=cv2.merge(b,g,r)

当可以不用split的时候就不要用,改用numpy的索引操作,因为split是比较耗时的操作。

5、图像扩充边界

扩充边界的时候就用函数copyMakeBorder(),这个函数有四个参数:

  1. src:输入图像

  2. top,bottom,left,right:对应的边界的像素数目

  3. borderType要添加哪种类型的边界

    1. cv2.BORDER_CONSTANT,添加有颜色的常数值边界,也就是下一个参数value;

    2. cv2.BORDER_REFLECT,边界颜色的镜像,fedcba|abcdefgh|hgfedcb;

    3. cv2.BORDER_REFLECT_101或者cv2.BORDER_DEFAULT,gfedcb|abcdefgh|gfedcba;

    4. cv2.BORDER_REPLICATE,重复最后一个像素来填充;

    5. cv2.BORDER_WRAP,这个比较...,应该是左移右移来填充吧,cdefgh| abcdefgh|abcdefg

  4. value:边界颜色

import numpy as np
import cv2 as cv

src = cv.imread("D:/lena.bmp")

src = cv.resize(src, (256, 256))
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, 
    cv.BORDER_CONSTANT, value=[255, 255, 255])
cv.imshow('BORDER_CONSTANT', dst)

src_gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT)
cv.imshow('BORDER_REFLECT', dst)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT_101)
cv.imshow('BORDER_REFLECT_101', dst)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REPLICATE)
cv.imshow('BORDER_REPLICATE', dst)

dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_WRAP)
cv.imshow('BORDER_WRAP', dst)
cv.waitKey(0)
cv.destroyAllWindows()

 

天还未黑,云怎敢灰;

雨还未下,风怎敢吹;

瓜还未熟,秧怎敢枯;

花还未落,树怎敢死;

你还未嫁,我怎敢老。

-- 汪国真 《怎敢》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章