十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要为大家展示了“opencv与numpy图像基本操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“opencv与numpy图像基本操作的示例分析”这篇文章吧。
专注于为中小企业提供做网站、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业鹰手营子免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000+企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。1. 像素基本操作
1.1 读取、修改像素
可以通过[行,列]坐标来访问像素点数据,对于多通道数据,返回一个数组,包含所有通道的值,对于单通道数据(如gray),返回指定坐标的值,也可以通过 [行,列,通道index] 来访问某坐标某通道的值。
>>> import cv2 >>> import numpy as np >>> img = cv2.imread('messi5.jpg')
>>> px = img[100,100] >>> print( px ) [157 166 200] # accessing only blue pixel >>> blue = img[100,100,0] >>> print( blue ) 157
可以直接通过坐标修改像素值
>>> img[100,100] = [255,255,255] >>> print( img[100,100] ) [255 255 255]
然而直接像上面这样去读取、修改每个像素的值,效率是比较低的,可以使用下面的方法,效率是更高的
# accessing RED value >>> img.item(10,10,2) 59 # modifying RED value >>> img.itemset((10,10,2),100) >>> img.item(10,10,2) 100
1.2 读取图像属性
读取图像尺寸,返回一个元组 (行,列,通道数)
>>> print( img.shape ) (342, 548, 3)
读取像素大小, 行 列 通道数
>>> print( img.size ) 562248
像素数据类型
>>> print( img.dtype ) uint8
1.3 图像ROI操作
可以直接编辑像素区域,例如把图像左下角50*50的像素复制到左上角
import cv2 import numpy as np img = cv2.imread("test.jpg") print(img.shape) roiTest = img[475:525, 0:50] img[0:50, 0:50] = roiTest cv2.imshow("image",img) cv2.waitKey(0)
1.4 分割、合并通道
有些情况下需要对图像的某一通道数据进行操作,此时会用到分割、合并通道数据
>>> b,g,r = cv2.split(img) >>> img = cv2.merge((b,g,r))
或者
b = img[:,:,0]
假设想编辑红色通道的数据,全部设置为0,不需要这样分割后编辑, img[:,:,2] = 0
这样即可。cv2.split操作是一个很耗时的操作,可以用numpy索引替代的操作,尽量用numpy索引来做。
1.4 生成图像边框
使用 cv2.copyMakeBorder
函数可添加图像边框,支持多种边框算法
void cv::copyMakeBorder ( InputArray src, //原图 //目标图(cpp版本中,若传入此数据且选BORDER_TRANSPARENT,则此数据被top/bottom/left/right切出来的roi部分不会被做任何修改,此图像大小=dst.rows+top+bottom,dst.cols+left+right) OutputArray dst, int top, //top/left/bottom/right 四个方向上的边框像素 int bottom, int left, int right, int borderType, //边框类型见下图 const Scalar & value = Scalar() //边框类型为BORDER_CONSTANT时的边框像素 )
BLUE = [255, 0, 0] img1 = cv2.imread("test.jpg") replicate = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_WRAP) constant = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=BLUE) print(img1.shape, reflect.shape) 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()
上面的例子可以比较直观的看到各种border的效果,同时也能发现,python版的api与cpp版本的相比,默认初始化了一块原始图尺寸+各方向边框尺寸的图像内存,作为内置的dst参数。
输出尺寸:(525, 700, 3) (725, 900, 3)
2. 图像的基本算术操作
2.1 图像相加
图像相加,两个图像应该有相同的shape,或者图像和一个标量相加,或者图像和一个与其通道数相同的一维数组相加。
opencv的相加与numpy相加时,在超出数据类型范围时的处理不同
>>> 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]
cpp版本的api还支持mask等参数
void cv::add ( InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1 )
2.2 图像混合
opencv通过 cv::addWeighted
函数提供了将两个图像混合在一起的方法
dst=α⋅img1+β⋅img2+γ
img1 = cv2.imread('ml.png') img2 = cv2.imread('opencv-logo.png') dst = cv2.addWeighted(img1,0.7,img2,0.3,0) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()
通过cv2.seamlessClone函数还能做更精细的图像局部融合。
以上是“opencv与numpy图像基本操作的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。