OpenCV图像处理基础

1、打开图片

import cv2
img = cv2.imread('messi5.jpg',cv2.IMREAD_COLOR)#读入一副彩色图像。图像的透明度会被忽略   默认参数。
cv2.imwrite('a1.jpg', img)  #保存图片
cv2.imshow('image', img)#窗口会自动调整为图像大小(窗口名,图片名)
cv2.waitKey(delay=0)#等待点击,0代表无限等待,返回按键的 ASCII 码值
cv2.destroyAllWindows() #从内存中销毁所有窗口

2、绘图函数

import numpy as np
import cv2

img = np.ones((512, 512, 3), np.uint8) #画背景板
cv2.line(img, pt1=(0, 0), pt2=(511, 511), color=(150,105,100), thickness=5) #画直线(背景,起点,终点,颜色RGB,线宽)
cv2.arrowedLine(img,pt1=(21, 13), pt2=(151, 401), color=(255, 0, 0), thickness=5) #画箭头线
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)  #画矩形(背景,左上角,右下角,颜色RGB,线宽)
cv2.circle(img, center=(447, 63), radius=63, color=(0, 0, 255), thickness=-1)  #画圆,封闭图形,线宽设为-1,会进行填充
# 画椭圆,(背景,中心点,(长轴,短轴),椭圆沿逆时针方向旋转的角度,椭圆弧演顺时针方向起始的角度和结束角度 如果是 0 很 360 就是整个椭圆
cv2.ellipse(img, center=(256, 256), axes=(100, 50), angle=30, startAngle=0, endAngle=180, color=255,thickness=-1)
#画多边形
pts1 = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32) #准备数据,每个点坐标
pts = pts1.reshape((-1, 1, 2))  #转换数组形状
cv2.polylines(img,pts=[pts],isClosed=True,color=(0,0,255))  #画图
cv2.fillPoly(img,pts=[pts],color=(0,0,255))   #填充颜色
#添加文字
font = cv2.FONT_HERSHEY_SIMPLEX  #字体类型
cv2.putText(img, text='OpenCV', org=(10, 400), fontFace=font, fontScale=2, color=(255, 255, 255), thickness=2)

cv2.imshow('image', img)
cv2.waitKey(delay=0)
cv2.destroyAllWindows()

3、修改图片像素

import cv2

img = cv2.imread('opencv/data/messi5.jpg')
px = img[100, 100] #获取坐标(100,100)的三色通道值
print(px)
blue = img[100, 100, 0] #获取坐标(100,100)蓝色通道的像素值
print(blue)
img[100, 100] = [105, 255, 255] #修改像素值
print(img[100, 100])
print(img.item(100, 100, 1)) #获取坐标(100,100)绿色通道的像素值
img.itemset((10, 10, 2), 105) #修改坐标(10,10)红色通道的像素值
print(img.item(10, 10, 2))
print(img.shape) #获取图片数组形状
img2 = cv2.imread('opencv/data/messi5.jpg', 0)  # 读取灰度图 gray
print(img2.size)  #获取像素数量
print(img2.dtype) #获取图片数组的数据类型,uint8
ball=img[280:340,330:390]  #通过切片获取图片一个区域
img[273:333,100:160]=ball   #修改像素值,达到复制效果,需要像素点一一对应
b,g,r=cv2.split(img) #拆分
print(b[100,100])
img=cv2.merge((b,g,r))  #合并
print(img[100,100,2])

cv2.imshow('image2', img)
cv2.waitKey(delay=0)
cv2.destroyAllWindows()

4、为图片添加边框

import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('../data/opencv_logo.png')

replicate = cv2.copyMakeBorder(img1, top=1, bottom=1, left=1, right=1, borderType=cv2.BORDER_REPLICATE)  #top=1,顶边框宽1个像素
reflect = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=BLACK)  # value 边界颜色

plt.subplot(231), plt.imshow(img1), 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()

5、图片算术运算

import numpy as np
import cv2

#相加
img1 = cv2.imread('opencv/data/ml.png')
img2 = cv2.imread('opencv/data/opencv_logo.png')
img2=cv2.resize(img2,(308,380)) #缩放到img1的大小
dst = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)  # 第一幅图的权重是 0.5 第二幅图的权重是 0.5,偏置0
img3=cv2.add(img1,img2)  #饱和相加,250+10=255
cv2.imshow('dst', np.hstack([img3,dst]))

#按位运算
img2 = cv2.resize(img2, (0, 0), fx=0.3, fy=0.3, interpolation=cv2.INTER_CUBIC)
img1 = cv2.imread('opencv/data/messi5.jpg')  # img1.shape(342, 548, 3)
rows, cols, channels = img2.shape #截取需要处理的区域
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #转换成灰度图
#该函数有两个返回值,第一个retVal(得到的阈值值),第二个就是阈值化后的图像。
ret, mask = cv2.threshold(img2gray, 245, 255, cv2.THRESH_BINARY) #原图,阈值,超过阈值后的新设值,黑白二值
#mask_bule = cv2.inRange(frame, lower, upper) #原图,下阈值,上阈值,阈值外的像素值为0,内部的像素值为255
mask_inv = cv2.bitwise_not(mask) #每个像素值进行二进制“非”操作,~1=0,~0=1
img1_bg = cv2.bitwise_and(roi, roi, mask=mask) #获取背景,每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv) #获取logo
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols]
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值