OpenCV的操作

1.图像的基本操作

1.1读取图像

python 复制代码
image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)

第一个参数图片的存储路径,第二个参数是图像的读取方式

第二个参数有三个选项:

  • cv2.IMREAD_UNCHANGED:保持原格式不变,-1;
  • cv2.IMREAD_COLOR:以灰度模式读入图片,可以用0 表示;
  • cv2.IMREAD_GRAYSCALE,1:,读入一副彩色图片,可以用1 表示;默认值

1.2. 获取照片尺寸

照片的shape属性会返回一个包含三个元素的元组:(高,宽,图像通道数量),所以用读取元组元素的方式来获取照片尺寸

python 复制代码
img_high = image_handler.shape[0]
img_width = image_handler.shape[1]

1.3. 像素操作

图片是由一系列像素点组成的,而读取的图片数据是以二维数组来存储的,因此我们可以通过读取数组的元素来获取某一个像素点的数据,然后进行编辑。

python 复制代码
    # 获取坐标(100,100)这个像素点的bgr数据
    (b,g,r) = image_handler[100,100]

下面的例子是将图片中的[0,200]和[0,100]的范围变成白色

python 复制代码
    image_path = "./resource/red_light.png"
    # 图像数据以二维数组的形式存储在image_handler中
    image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    # 获取照片尺寸
    img_high = image_handler.shape[0]
    img_width = image_handler.shape[1]
    print(img_high, img_width)


    i=j=0
    for i in range(1, 200):
        image_handler[i,j] = (255, 255, 255)
        for j in range(1, 100):
            image_handler[i, j] = (255, 255, 255)

    cv2.imshow('image', image_handler)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果为

2. 图像的几何变换

2.1 图片缩放

cv2.resize(InputArray src, OutputArray dst, Size, fx, fy,interpolation)

参数含义:

|---------------|---------------|
| InputArray | 输入图片 |
| OutputArray | 输出图片 |
| Size | 输出图片尺寸 |
| fx, fy | 沿x 轴,y 轴的缩放系数 |
| interpolation | 插入方式 |

其中interpolation 选项所用的插值方法:

|----------------|-----------------|
| INTER_NEAREST | 最近邻插值 |
| INTER_LINEAR | 双线性插值(默认设置) |
| INTER_AREA | 使用像素区域关系进行重采样 |
| INTER_CUBIC | 像素邻域的双三次插值 |
| INTER_LANCZOS4 | 像素邻域的Lanczos 插值 |

python 复制代码
# 图像数据以二维数组的形式存储在image_handler中
    image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    # 获取照片尺寸
    img_high, img_width = image_handler.shape[0:2]
    print(img_high, img_width)
    
    # 将图像缩小至原来的二分之一
    image_handler_resize = cv2.resize(image_handler,(img_high//2, img_width//2))
    # 显示缩放后的图像
    cv2.imshow("resize_image",image_handler_resize)

    # 最近邻插值法缩放到原来的四分之一
    #resize第二个参数(0,0)表示缩放后的尺寸,(0,0)表示按缩放后的比例显示,
    #若不为(0,0),比如为(100,100)则缩放后按指定尺寸(100,100)显示
    image_handler_test1 = cv2.resize(image_handler,(0,0),fx=0.25,fy=0.25,interpolation=cv2.INTER_NEAREST) 
    cv2.imshow("resize_1/4",image_handler_test1)
    print(image_handler_test1.shape[:2])

    # 显示原图像
    cv2.imshow('image', image_handler)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2.2 图片剪切

python 复制代码
    # 图像数据以二维数组的形式存储在image_handler中
    image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    # 获取照片尺寸
    img_high, img_width = image_handler.shape[0:2]
    print(img_high, img_width)

    # 图片的剪切,注意剪切的分辨率不要超过图片原有的分辨率
    image_cut = image_handler[100:200, 100:200] # 剪切像素点100到200的图片内容

    # 显示剪切后的图片
    cv2.imshow("cut_image", image_cut)


    # 显示原图像
    cv2.imshow('image', image_handler)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果:

2.3 图片平移

图片的数据是通过二维矩阵的形式存储的,因此可以用矩阵的平移来完成图片的平移

目前图片和原图片的对应关系是:

对应的变换矩阵是

公式里是按x轴和y轴方向缩放系数,在图片平移的情况里这两个参数均为1

若将图片src向右侧移动200像素,向下移动100个像素点,那么对应的变换矩阵是

代码实现为:

python 复制代码
    # 图像数据以二维数组的形式存储在image_handler中
    image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    # 获取照片尺寸
    img_high, img_width = image_handler.shape[0:2]
    print(img_high, img_width)

    # 实现转换矩阵
    matShift = np.float32([[1,0,200],[0,1,100]])
    # 平移图片
    image_move = cv2.warpAffine(image_handler,matShift,(img_high,img_width))
    # 显示平移后的图片
    cv2.imshow("image_move", image_move)

    # 显示原图像
    cv2.imshow('image', image_handler)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果:

2.4 图片镜像

图片镜像分水平镜像和垂直镜像。水平镜像以图像垂直中线为轴,将图像的像素进行对换,也就是将图像的左半部和右半部对调。垂直镜像则是以图像的水平中线为轴,将图像的上半部分和下半部分对调。

镜像的算法比较简单,以水平镜像为例子,假设下图为图像的像素点阵列:(x0,y0)为原图的像素坐标,(a0,y0)为水平镜像后的像素坐标。以第一个像素点(x0,y0)为例子,经过镜像后的坐标为(a5,y0)。可见水平镜像是像素水平坐标发生变化,而垂直坐标没有变化。

两张照片中的所有像素点都关于垂直对称轴对称,那么镜像后的a5的像素坐标为:

用代码实现为:

python 复制代码
   for i in range(0, height):
        for j in range(0, width):
            mirrorImage[i, j] = img_handler[i, width-j-1]

实现水平镜像和垂直镜像的完整代码为:

python 复制代码
# mirror_image_vertical() 垂直翻转图像
def mirror_image_vertical():
    img_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    img_info = img_handler.shape
    height = img_info[0]
    width = img_info[1]
    deep = img_info[2]

    newImginfo = (height, width, deep)
    mirrorImage = np.zeros(newImginfo, np.uint8)
#     将原图片填充到新图片中
    for i in range(0, height):
        for j in range(0, width):
            mirrorImage[i, j] = img_handler[height-i-1, j]

    cv2.imwrite("mirror_image_vertical.jpg", mirrorImage)
    cv2.imshow("mirror_image_vertical", mirrorImage)
    cv2.imshow("origin_image", img_handler)
    print("mirror image size:",mirrorImage.shape)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# mirror_image_horizontal 水平翻转图像
def mirror_image_horizontal():
    # 读取原始图像
    img_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    # 获取图像的高height,宽width,色深deep
    img_info = img_handler.shape
    height = img_info[0]
    width = img_info[1]
    deep = img_info[2]
    
    newImginfo = (height, width, deep)
    # 新建一个空的图像阵列
    mirrorImage = np.zeros(newImginfo, np.uint8)
#     将原图片填充到新图片中
    for i in range(0, height):
        for j in range(0, width):
            mirrorImage[i, j] = img_handler[i, width-j-1]

    cv2.imwrite("mirror_image_horizontal.jpg", mirrorImage)
    cv2.imshow("mirror_image_horizontal", mirrorImage)
    cv2.imshow("origin_image", img_handler)
    print("mirror image size:",mirrorImage.shape)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

水平翻转结果:

垂直翻转的结果为:

相关推荐
啊文师兄4 分钟前
使用 Pytorch 搭建视频车流量检测资源(基于YOLO)
人工智能·pytorch·yolo
使者大牙15 分钟前
【LLM学习笔记】第三篇:模型微调及LoRA介绍(附PyTorch实例)
人工智能·pytorch·python·深度学习
Elastic 中国社区官方博客22 分钟前
Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
陌上阳光23 分钟前
动手学深度学习69 BERT预训练
人工智能·深度学习·bert
车载诊断技术23 分钟前
电子电气架构--- 实施基于以太网的安全车载网络
网络·人工智能·安全·架构·汽车·电子电器架构
学步_技术1 小时前
自动驾驶系列—自动驾驶车辆的姿态与定位:IMU数据在复杂环境中的关键作用
人工智能·自动驾驶·imu
开发者每周简报1 小时前
当微软windows的记事本被AI加持
人工智能·windows·microsoft
沉下心来学鲁班1 小时前
欺诈文本分类检测(十八):基于llama.cpp+CPU推理
人工智能·语言模型·分类·cpu·llama.cpp
新手小白勇闯新世界1 小时前
点云论文阅读-1-pointnet++
论文阅读·人工智能·深度学习·神经网络·计算机视觉
小菜日记^_^1 小时前
BEAGLE: Forensics of Deep Learning Backdoor Attack for Better Defense(论文阅读)
论文阅读·人工智能·深度学习·sp·ai安全·backdoor 后门攻击·安全四大