OpenCV-06 图像的基本操作

图像处理是计算机视觉领域的基础,本文将介绍图像的基本操作,包括图像的读取、像素操作、通道处理以及边界处理等内容。

1.获取图像基本信息

使用OpenCV和Matplotlib库,我们可以轻松地进行图像基本操作。首先,我们来获取图像的高度、宽度和通道数:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

def getImgShape():
    #读取一张图片
    img = cv.imread("../img/img1.jpg")
    h, w, c = img.shape
    print(f"图像高度: {h}, 宽度: {w}, 通道数: {c}")

2. 获取和修改像素值

接下来,我们演示如何获取和修改图像的像素值。这是图像处理中常见的基础操作之一:

def getImgPixel():
    img = cv.imread("../img/img1.jpg")
    
    # 获取像素值
    print("像素值 (100, 100):", img[100, 100])
    print("蓝色通道值 (100, 100):", img[100, 100, 0])
    print("绿色通道值 (100, 100):", img[100, 100, 1])
    print("红色通道值 (100, 100):", img[100, 100, 2])
    
    # 修改像素值(不推荐,效率低)
    for h in range(100, 200):
        for w in range(300, 600):
            img[h, w] = [0, 255, 255]  # 将像素值改为蓝色
            
    print("总像素数:", img.size)
    print("图像数据类型:", img.dtype)

getImgPixel()

3. 拆分和合并图像通道

图像的通道处理是图像处理中的重要操作,可以对图像的RGB通道进行独立处理:

def splitMergeChannels():
    img = cv.imread("../img/img1.jpg")
    
    # 拆分通道
    b, g, r = cv.split(img)
    print("蓝色通道:", b)
    print("绿色通道:", g)
    print("红色通道:", r)
    
    # 合并通道
    img_merged = cv.merge((b, g, r))

splitMergeChannels()

4. 图像边界处理

图像边界处理是在图像处理中常见的需求,OpenCV提供了多种边界填充方式:

def makeImageBoundaries():
    img = np.zeros((512, 512, 3), np.uint8)
    cv.rectangle(img, (0, 0), (512, 512), (255, 0, 0), -1)  # 绘制蓝色矩形
    
    RED = [0, 0, 255]
    replicate = cv.copyMakeBorder(img, 10, 10, 10, 10, cv.BORDER_REPLICATE)
    reflect = cv.copyMakeBorder(img, 10, 10, 10, 10, cv.BORDER_REFLECT)
    reflect101 = cv.copyMakeBorder(img, 10, 10, 10, 10, cv.BORDER_REFLECT_101)
    wrap = cv.copyMakeBorder(img, 10, 10, 10, 10, cv.BORDER_WRAP)
    constant = cv.copyMakeBorder(img, 10, 10, 10, 10, cv.BORDER_CONSTANT, value=RED)
    
    plt.subplot(231), plt.imshow(img), plt.title('原始图像')
    plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('复制边界')
    plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('反射边界')
    plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('反射101边界')
    plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('环绕边界')
    plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('常数边界')
    plt.tight_layout()
    plt.show()

makeImageBoundaries()

本文介绍了如何使用OpenCV和Matplotlib库进行基本的图像操作,包括获取图像信息、像素操作、通道处理和边界处理。这些技术是计算机视觉和图像处理中的基础,有助于进一步深入学习和应用。

学习中的问题

subplot(231)是什么可以改成subplot(1)吗?

在Matplotlib中,subplot(231)表示将当前图形分割成2行3列,并且选择第1个子图作为当前操作的子图。这种形式是过时的,应该使用更现代的方式来定义子图的位置。

如果你想简化代码,并且只需要一个子图,可以使用以下方式之一:

  1. 使用subplot()方法:可以直接使用subplot()方法来创建一个单独的子图。例如,subplot(1, 1, 1)表示将整个图形分割成1行1列,并选择第1个子图(也就是整个图形作为一个子图)。

import matplotlib.pyplot as plt

plt.subplot(1, 1, 1)

 这种方式更加直观和现代化。

2.使用subplots()方法:使用subplots()方法创建一个图形和一个子图,这是更推荐的方式:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

 3. 这种方式会返回一个Figure对象(图形)和一个Axes对象(子图),这样可以更加灵活地操作子图。

所以,subplot(231)并不推荐,可以改成更清晰的方式如上所述。

附:

def openImg(img):
    # 打开一个窗口,这段代码可以写也可以不写,不写打开的图片是不能改变大小的,窗口的名称必须一致,不然会打开两个
    cv.namedWindow('image',cv.WINDOW_NORMAL)
    # 加载显示图片
    cv.imshow('image', img)
    # 等待键盘输入 结束这个程序 参数0是指0毫秒,传入1000则是指1s之后继续执行代码,但是随便键盘输入也将会执行后面代码 0则是一直等待键盘输入
    key = cv.waitKey(0)
    # ord返回的是s按键对应的数字
    if key == ord('s'):
        # 按下s保存图片
        cv.imwrite('test.jpg', img)
    # 销毁全部窗口
    cv.destroyAllWindows()

  关注公众号:资小库,问题快速答疑解惑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写爬虫的程序员B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值