openCV实战

openCV实战

一、图像读取

读取图像

import cv2
img = cv2.imread('image.jpg')

cv2.imread()读取图像文件,返回一个NumPy数组,如果图像路径错误则返回None

显示图像

# 显示图像
cv2.imshow("Display Window", image)

#等待按键输入
cv2.waitKey(0)

关闭所有窗口
cv2.destoryAllWindows()


保存图像

# 保存图像
cv2.imwrite("output_image.jpg", image)

二、图像基本操作

1、访问和修改像素值

# 获取像素值(BGR格式)
pixel_value = image[100, 100]

# 修改像素值
image[100, 100] = [255, 255, 255]

2、图像ROI(Region of interest)

# 获取ROI
roi = image[50:150, 50:150]

# 修改ROI
image[50:150, 50:150] = [0, 255, 0]

3、图像通道分离与合并

# 分离通道
b, g, r = cv2.split(image)

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

4、图像缩放、旋转、平移、翻转

# 缩放
resized_image = cv2.resize(image, (new_width, new_height))

# 旋转
rotation_matrix = cv2.getRotationMatrix2D((center_x, center_y), angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))

# 平移
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])  # tx, ty 为平移距离
translated_image = cv2.warpAffine(image, translation_matrix, (width, height))

# 翻转
flipped_image = cv2.flip(image, flip_code)  # flip_code: 0 (垂直翻转), 1 (水平翻转), -1 (双向翻转)

5、图像算术运算

1、图像加法

result = cv2.add(image1, image2)

2、图像减法

result = cv2.subtract(image1, image2)

3、图像混合

result = cv2.addWeighted(image1, alpha, image2, beta, gamma)

alphabeta 是权重,gamma 是标量值。

三、图像阈值处理

1、简单阈值处理

简单阈值处理是最基础的阈值处理方法。它通过设定一个固定的阈值,将图像中的像素分为两类。

函数原型

retval, dst = cv2.threshold(src, thresh, maxval, type)

参数说明

  • src: 输入图像,通常为灰度图像。

  • thresh: 设定的阈值。

  • maxval: 当像素值超过(或小于,根据类型)阈值时,赋予的新值。

  • type: 阈值处理的类型,常见的类型有:

    • cv2.THRESH_BINARY: 如果像素值大于阈值,则赋予 maxval,否则赋予 0
    • cv2.THRESH_BINARY_INV: 与 cv2.THRESH_BINARY 相反,如果像素值大于阈值,则赋予 0,否则赋予 maxval
    • cv2.THRESH_TRUNC: 如果像素值大于阈值,则赋予阈值,否则保持不变。
    • cv2.THRESH_TOZERO: 如果像素值大于阈值,则保持不变,否则赋予 0
    • cv2.THRESH_TOZERO_INV: 与 cv2.THRESH_TOZERO 相反,如果像素值大于阈值,则赋予 0,否则保持不变。

返回值

  • retval: 实际使用的阈值(在某些情况下可能与设定的阈值不同)。
  • dst: 处理后的图像。

实例

import cv2
import numpy as np

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

# 简单阈值处理
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

# 显示结果
cv2.imshow('Binary Threshold', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、自适应阈值处理 (cv2.adaptiveThreshold())

在某些情况下,图像的亮度分布不均匀,使用固定的阈值可能无法得到理想的效果。自适应阈值处理通过为图像的不同区域计算不同的阈值,从而更好地处理这种情况。

函数原型

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

参数说明

  • src: 输入图像,通常为灰度图像。

  • maxValue: 当像素值超过(或小于,根据类型)阈值时,赋予的新值。

  • adaptiveMethod: 自适应阈值计算方法,常见的类型有:

    • cv2.ADAPTIVE_THRESH_MEAN_C: 阈值是邻域的平均值减去常数 C
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 阈值是邻域的加权平均值减去常数 C,权重由高斯函数确定。
  • thresholdType: 阈值处理的类型,通常为 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV

  • blockSize: 计算阈值时使用的邻域大小,必须为奇数。

  • C: 从平均值或加权平均值中减去的常数。

返回值

  • dst: 处理后的图像。

实例

import cv2
import numpy as np

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

# 自适应阈值处理
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

# 显示结果
cv2.imshow('Adaptive Threshold', thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、Otsu's 二值化 (cv2.threshold() with cv2.THRESH_OTSU)

Otsu's 二值化是一种自动确定阈值的方法。它通过最大化类间方差来找到最佳的全局阈值,适用于双峰图像(即图像直方图有两个明显的峰值)。

函数原型

retval, dst = cv2.threshold(src, thresh, maxval, type)

参数说明

  • src: 输入图像,通常为灰度图像。
  • thresh: 由于 Otsu's 方法会自动确定阈值,因此该参数通常设置为 0
  • maxval: 当像素值超过(或小于,根据类型)阈值时,赋予的新值。
  • type: 阈值处理的类型,通常为 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV,并加上 cv2.THRESH_OTSU

返回值

  • retval: 自动确定的阈值。

  • dst: 处理后的图像。

实例

import cv2
import numpy as np

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

# Otsu's 二值化
ret, thresh3 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示结果
cv2.imshow('Otsu\'s Threshold', thresh3)
cv2.waitKey(0)
cv2.destroyAllWindows()

openCV实战
http://ddxd.xyz//archives/opencvshi-zhan
作者
Administrator
发布于
2025年03月21日
许可协议