opencv基本操作一(读取、处理、保存图片)

重要函数&概念

代码

例程一

  • 本例程会读取一张图片,并对图片进行仿射变换和在图片上画圆等操作,并一一用窗口显示出来,最后把图片保存
import cv2  # 引用OpenCV功能包
import numpy as np  # 引用数组功能包

# 读取图片
img = cv2.imread('1.ImageProcess.jpg')
img_hight, img_weight, img_channels = img.shape  # 获取图片尺寸高度、宽度、通道数
cv2.imshow("win_1", img)  # 窗口显示图片

# 缩小图片尺寸,再次获取图片尺寸
img1 = cv2.resize(img,(int(img_weight / 2), int(img_hight / 2)), interpolation = cv2.INTER_AREA)
img1_hight, img1_weight, img1_channels = img1.shape
cv2.imshow("win_2", img1)

Quit = 0  # 是否继续运行标志位
# 提示停止方法
print('Press key "Q" to stop.')

while Quit == 0:
    keycode = cv2.waitKey(3)  # 每3ms刷新一次图片,同时读取3ms内键盘的输入
    if (keycode == ord('Q')):
        Quit = 1

    ###仿射变换相关处理###
    # 创建数组,用于仿射变换
    Mat1 = np.array([[1.5, 0, -150],  # x轴放大1.5倍,并平移-150
                     [0, 1.5, -130]]  # y轴放大1.5倍,并平移-130
                    , dtype=np.float32)
    img2 = cv2.warpAffine(img, Mat1, (img_weight, img_hight))  # 仿射变换
    cv2.imshow("win_3", img2)  # 窗口显示图片
    cv2.imwrite('win_3.jpg', img2)  # 保存图片

    theta = 30 * np.pi / 180  # 30度的弧度值
    # 创建数组,用于仿射变换
    Mat2 = np.array([[1, np.tan(theta), 0],  # 图片绕上边框逆时针旋转 15 度
                    [0, 1, 0]]
                    , dtype=np.float32)
    img3 = cv2.warpAffine(img, Mat2, (img_weight, img_hight)) # 仿射变换
    cv2.imshow("win_4", img3)  # 窗口显示图片
    cv2.imwrite('win_4.jpg', img3)
    # 保存图片

    # 创建数组,用于仿射变换
    Mat3 = np.array([[np.cos(theta), -np.sin(theta), 0],  # 绕左上角顺时针旋转15度
                    [np.sin(theta), np.cos(theta),0]]
                    ,dtype=np.float32)
    img4 = cv2.warpAffine(img, Mat3, (img_weight, img_hight))
    # 仿射变换
    cv2.imshow("win_5", img4)  # 窗口显示图片
    cv2.imwrite('win_5.jpg', img4)
    # 保存图片

    ###在图片上画画###
    # 画直线 cv2.line(图片, 起点坐标, 终点坐标, BGR, 线条粗细)
    cv2.line(img1, (300, 300), (500, 300), (255, 255, 0), 2)

    # 画圆cv2.circle(图片, 原点坐标, 半径, BGR, 线条粗细)
    cv2.circle(img1, (300, 300), 200, (0, 0, 255), 2)

    # 画矩形 cv2.rectangle(图片, 矩形左上角坐标, 矩形右下角, BGR, 线条粗细)
    cv2.rectangle(img1, (600, 600), (400, 200), (155, 0, 0), 3)

    # 创建多边形顶点坐标数组(可以有多个多边形)
    triangles = np.array([
        [(200, 100), (145, 203), (255, 203)],
        [(60, 140), (20, 197), (100, 197)]
    ])
    # 画填充多边形 cv2.fillPoly(图片, 多边形顶点坐标数组, BGR)
    cv2.fillPoly(img, triangles, (0, 255, 0))

    # 显示文字 cv2.putText(图片,文字,文字左下角坐标,字体显示格式,字体大小,BGR,线条粗细)
    cv2.putText(img1, 'hello,opencv', (1, 30), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 3)

    cv2.imshow("win_6", img1)  # 显示画画后的图片

print('Quitted!')  # 提示程序已停止
cv2.destroyAllWindows()  # 程序停止前关闭所有窗口

例程二

  • 本例程将利用数组创建一个 三通道图像,对其像素点逐个进行赋值,还进行了截取指定区域图像的操作和 HSV、LAB 色域的转换
import cv2
import numpy as np

img_height=400 #设定图片高度
img_width=600  #设定图片宽度


Quit = 1 #是否继续运行标志位
#提示停止方法
print ('Press key "Q" to stop.')

while Quit :
    keycode = cv2.waitKey(3)  #每3ms刷新一次图片,同时读取3ms内键盘的输入
    if keycode & 0xFF == ord('q'): #如果按下“Q”键,停止运行标志位置1,调出while循环,程序停止运行
        Quit = 0

     #创建一个img_height*img_width大小的数组,数组中的每个元素有3个子元素,子元素的数据类型为uint8
     #相当于创建img_height*img_width分辨率的图片,图片为3通道图片。最后+120相当于给所有原始赋值120
    img = np.zeros((img_height, img_width, 3),dtype=np.uint8)+120

    # 对图像第300列到400列的像素点赋值[255,0,0]([B,G,R])
    for col in range(img_width):
        for row in range(img_height):
            if col < 400 and col > 300:
                img[row,col] = [255,0,0]
    cv2.imshow('win1',img)

    # 对图像第100行到200行的像素点赋值[0,255,0]([B,G,R])
    for col in range(img_width):
        for row in range(img_height):
            if row < 200 and row > 100:
                img[row,col] = [0,255,0]
    cv2.imshow('win2',img)

    # 截取图片,第50行到第300行于第350列到500列的区域
    # img[(height_start:height_end), (width_start:height_end)]

    img_CutOff = img[50:300,350:500]
    cv2.imshow('win3',img_CutOff )

    # 创建的图片默认是BGR格式,可以转为其它格式后再查看效果
    img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    cv2.imshow('img4',img_hsv)

    img_lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)  # LAB格式
    cv2.imshow("img5", img_lab)

print('Quitted!')  # 提示程序已停止
cv2.destroyAllWindows()  # 程序停止前关闭所有窗口
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值