Open CV图像基本操作可莉版


一、处理单个像素值

图像是由像素组成的矩阵,每个像素都有一个或多个值,表示颜色或灰度。在灰度图像中,每个像素只有一个值,表示灰度强度;在彩色图像中,每个像素通常有三个值,分别表示红色、绿色和蓝色(RGB)通道的强度。

访问像素值

假设我们有一个灰度图像 img,可以通过 img[y, x] 来访问位于 (x, y) 位置的像素值。对于彩色图像,可以通过 img[y, x, c] 来访问特定通道 c 的像素值,其中 c 为 0(蓝色)、1(绿色)或 2(红色)。

实例

import cv2

# 读取图像
img = cv2.imread('image.jpg')

# 访问像素值
pixel_value = img[100, 150]  # 访问 (150, 100) 位置的像素值
print(pixel_value)

修改像素值

实例

# 修改像素值
img[100, 150] = [255, 255, 255]  # 将 (150, 100) 位置的像素值设置为白色

二、处理单个ROI区域(自选区域)

ROI 是指图像中我们感兴趣的区域 (Region of Interest)。通过提取 ROI,我们可以只对图像的特定部分进行处理,从而提高处理效率。

提取 ROI

在 OpenCV 中,可以通过切片操作来提取 ROI。假设我们想要提取图像中左上角 100x100 像素的区域:

实例

# 提取 ROI
roi = img[0:100, 0:100]

修改 ROI

提取 ROI 后,可以对其进行修改,然后将修改后的 ROI 放回原图像中。
实例

# 修改 ROI
roi[:, :] = [0, 255, 0]  # 将 ROI 区域设置为绿色

# 将修改后的 ROI 放回原图像
img[0:100, 0:100] = roi

三、 处理图像通道

彩色图像通常由多个通道组成,例如 RGB 图像的三个通道。有时我们需要将这些通道分离出来进行单独处理,然后再将它们合并回原图像。

通道分离

在 OpenCV 中,可以使用 cv2.split() 函数将图像的通道分离。
实例

# 通道分离
import cv2

if __name__ == '__main__':
    imgPath = 'D:\Word\keli.jpg'
    img = cv2.imread(imgPath)
    cv2.imshow('image', img)
	b, g, r = cv2.split(img)
	# 下面会依次显示r,g,b三张图,每张3秒
    cv2.imshow('b', b)
    cv2.waitKey(3000)
    cv2.imshow('g', g)
    cv2.waitKey(3000)
    cv2.imshow('r', r)
    cv2.waitKey(3000)
    # 下面会依次保存r,g,b三张图,不像上面顺序是反的
    cv2.imwrite('D:\Word\keli-r.jpg', r)
    time.sleep(5)
    cv2.imwrite('D:\Word\keli-g.jpg', g)
    time.sleep(5)
    cv2.imwrite('D:\Word\keli-b.jpg', b)

原图
可莉原图
RGB图
可莉RGB图

通道合并

分离后的通道可以使用 cv2.merge() 函数合并回原图像。

实例

# 通道合并
merged_img = cv2.merge([b, g, r])

四、处理整体

图像的几何变换是图像处理中常见的操作,包括缩放、旋转、平移和翻转。

图像缩放

图像缩放可以通过 cv2.resize() 函数实现。可以指定缩放后的图像尺寸或缩放比例。

实例

# 图像缩放
resized_img = cv2.resize(img, (200, 200))  # 将图像缩放为 200x200 像素

图像旋转

图像旋转可以通过 cv2.getRotationMatrix2D() 和 cv2.warpAffine() 函数实现。需要指定旋转中心和旋转角度。

实例

# 图像旋转
	# 取高和宽
    h, w = img.shape[:2]
    # 计算旋转中心
    center = (int(w/2), int(h/2))
    # 得到2维线性变化
    M = cv2.getRotationMatrix2D(center, 180, 1)
    # 将变化作用到img上
    img = cv2.warpAffine(img, M, (w, h))
    # 显示
    cv2.imshow('img', img)
    cv2.waitKey(0)

图像平移

图像平移可以通过 cv2.warpAffine() 函数实现。需要指定平移矩阵。

实例

# 图像平移
	# 向右平移 100 像素,向下平移 50 像素
	M2 = np.float32([[1, 0, 100], [0, 1, 50]])
    img = cv2.warpAffine(img, M2, (w, h))
    cv2.imshow('img', img)
    cv2.waitKey(0)

平移以后空的地方显示黑色背景
移动后

图像翻转

图像翻转可以通过 cv2.flip() 函数实现。可以指定翻转方向(水平、垂直或两者)。

实例

# 图像翻转
flipped_img = cv2.flip(img, 1)  # 水平翻转

计划后面都用这一张原创图练习

### 计算机视觉图像处理的基本操作计算机视觉领域,图像处理是一项基础且重要的技能。以下是基于OpenCV和PIL两种常用工具的图像处理基本操作说明。 #### 1. 图像的读取与保存 使用OpenCV可以方便地通过`cv2.imread()`函数读取图像并存储为NumPy数组形式[^3]。该数组具有形状`(h, w, c)`,分别代表高度、宽度以及通道数(RGB)。如果需要保存图像,则可调用`cv2.imwrite()`完成此过程[^4]。 相比之下,PIL提供了更简洁的方式加载图片实例——借助`Image.open()`方法即可获取到一个图像对象[^2]。当希望将修改后的数据存盘时,只需执行`.save()`命令即可[^1]。 ```python import cv2 from PIL import Image # OpenCV方式读写图像 image_cv = cv2.imread('example.jpg') cv2.imwrite('output_example_cv.png', image_cv) # PIL方式读写图像 image_pil = Image.open('example.jpg') image_pil.save('output_example_pil.png') ``` #### 2. 显示图像 除了上述提到的功能外,展示图像也是不可或缺的一环。OpenCV自带窗口支持实时预览效果;然而为了获得更好的兼容性和绘图灵活性,推荐配合Matplotlib一起工作: ```python import matplotlib.pyplot as plt plt.imshow(cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB)) plt.axis("off") # 关闭坐标轴 plt.show() ``` 而对于PIL而言,其内置show()函数可以直接弹出外部程序查看器: ```python image_pil.show() ``` #### 3. 颜色空间转换 很多时候我们需要改变输入源的颜色模式以便后续分析或呈现特定风格的画面。比如BGR转成灰度级或者HSV色彩模型等。这一步骤可以通过如下代码轻松达成目标[^5]: ```python gray_image = cv2.cvtColor(image_cv, cv2.COLOR_BGR2GRAY) hsv_image = cv2.cvtColor(image_cv, cv2.COLOR_BGR2HSV) ``` 值得注意的是,在某些情况下可能还需要考虑不同软件包之间存在的差异性问题,例如默认顺序颠倒等情况需额外注意调整参数设置以匹配预期输出结果。 --- ### 性能考量 尽管两者都能满足日常开发需求,但从效率角度来看,由于OpenCV内部实现了大量优化算法并且充分利用了底层硬件资源(如SIMD指令集),所以在面对大规模复杂运算场景下往往表现得更为出色一些。不过具体选择哪种框架还是要看项目实际应用场景和个人偏好决定。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值