2019-03-08 14:16:53 1302浏览
今天扣丁学堂Python培训老师给大家介绍一篇关于opencv与numpy的图像基本操作,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧。
>>> 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
>>> print( img.shape ) (342, 548, 3)
>>> print( img.size ) 562248
>>> print( img.dtype ) uint8
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)
>>> b,g,r = cv2.split(img) >>> img = cv2.merge((b,g,r))
b = img[:,:,0]
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)
>>> 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]
void cv::add ( InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1 )
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函数还能做更精细的图像局部融合。
【关注微信公众号获取更多学习资料】