opencv图像处理操作——python版

IDE:pycharm、python:3.11、opencv自行参考配置

视频图像的读取与处理

示例代码如下

import cv2
import numpy as np
import matplotlib.pyplot as plt

def cvshow(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread("D:\\pycharmyunxing\\qiaoba.jpeg",cv2.IMREAD_GRAYSCALE)
img1 = cv2.imread("D:\\pycharmyunxing\\qiaoba.jpeg",0)
img2 = cv2.imread("D:\\pycharmyunxing\\qiaoba.jpeg",cv2.IMREAD_COLOR)

cvshow("yuan",img)
cvshow("1",img1)
cvshow("2",img2)
cv2.imwrite("名称",img)

这里使用的函数包括cvshow封装的是显示图像的函数imshow()、waitkey()、destroyAllWindows()

  1. imshow():

    • 作用: 在窗口中显示图像。
    • 用法: cv2.imshow(window_name, image)
    • 参数:
      • window_name: 窗口的名称,字符串类型。
      • image: 要显示的图像,numpy 数组类型。
  2. waitKey():

    • 作用: 等待用户按下键盘上的某个键,并返回按下的键的 ASCII 码值。
    • 用法: cv2.waitKey(delay)
    • 参数:
      • delay: 等待时间,单位为毫秒。如果设置为 0,则会一直等待,直到用户按下某个键。
  3. destroyAllWindows():

    • 作用: 关闭所有已打开的窗口。
    • 用法: cv2.destroyAllWindows()

imread()函数 

img = cv2.imread(filename, flags=None)

参数说明:

  1. filename: 图像文件的路径和文件名。
  2. flags: 可选参数,用于指定读取图像的方式。常用的 flags 有:
    • cv2.IMREAD_COLOR: 以彩色图像的方式读取图像(默认)。
    • cv2.IMREAD_GRAYSCALE: 以灰度图像的方式读取图像。
    • cv2.IMREAD_UNCHANGED: 以包含 alpha 通道的方式读取图像。

返回值:

  • 如果读取成功,则返回一个 numpy 数组,表示读取到的图像。
  • 如果读取失败,则返回 None

 效果图展示:

fig, axes = plt.subplots(1, 3, figsize=(12, 6))
axes[0].imshow(img)
axes[0].set_title("yuan")
axes[1].imshow(img1)
axes[1].set_title("1")
axes[2].imshow(img2)
axes[2].set_title("1")
plt.show()

这里颜色显示是因为图像通道由RGB变成BGR 

print(type(img))
print(img.size)
print(img.dtype)

这段代码用于打印图像的一些基本信息,包括:

  1. 图像的数据类型
  2. 图像的大小
  3. 图像的数据类型

运行结果:

 

图像融合及加法操作

 这里示例图像过大输出打印以前五行像素值为例

image = cv2.imread("D:\\pycharmyunxing\\venv\\image3.png")
image_1 = image+10
print("原图像像素",image[:5,:,0])
print("加法",image_1[:5,:,0])
print("直接加法",(image+image_1)[:5,:,0])
print("add加法",cv2.add(image,image_1)[:5,:,0])

image_2 = cv2.imread("D:\\pycharmyunxing\\venv\\image1.png")

image_2 = cv2.resize(image_2,(1110,870))
image_3 = image+image_2
res = cv2.addWeighted(image,0.4,image_2,0.6,0)
res_1 = cv2.resize(res,(0,0),fx=2,fy=2)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(res)
axes[0].set_title("yuan")
axes[1].imshow(res_1)
axes[1].set_title("1")
plt.show()

输出:

image_1 = image+10

第一种加法的实现是将所有数值都加10

(image+image_1)[:5,:,0]

第二种是将两张图像的像素值完全相加这里图像的像素中值范围是0~255,两张图像的数值相加中会有超过255的情况这种加法得到的结果是得到的数值%255,即是对于255进行取余。

cv2.add(image,image_1)[:5,:,0]

第三种是使用opencv中add函数进行加法操作它与第二种的区别在于数值超过255的情况时,像素值就是255。

后面时图像融合的操作

这里选用的时两张胸部X射线图(2、3),1和2表示的是融合后的结果和对于融合图像做尺寸变换的结果。

addWeighted() 函数是 OpenCV 中用于将两个图像进行加权融合的函数。它可以将两个图像按照指定的权重进行融合,得到一个新的图像。

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)

参数说明:

  1. src1: 第一个输入图像,numpy 数组格式。
  2. alpha: 第一个输入图像的权重。
  3. src2: 第二个输入图像,numpy 数组格式。
  4. beta: 第二个输入图像的权重。
  5. gamma: 融合后图像的偏移量。

返回值:

  • 融合后的图像,numpy 数组格式。

 这里使用了resize()函数

cv2.resize() 函数是 OpenCV 中用于调整图像大小的函数。这里展示了根据指定的缩放因子或目标大小来调整图像的尺寸和指定图像尺寸两种方式。

image_2 = cv2.resize(image_2,(1110,870))

res_1 = cv2.resize(res,(0,0),fx=2,fy=2)

第一种直接修改我们需要的尺寸。

第二种是按照缩放比例修改

以上述代码中的 res_1 = cv2.resize(res,(0,0),fx=2,fy=2)为例子 可以解释如下:

  1. res: 这是输入图像,即需要调整大小的图像。

  2. (0,0): 这是目标图像的大小。如果设置为 (0,0),则表示根据缩放因子来计算目标大小。

  3. fx=2: 水平方向的缩放因子。这里设置为 2,表示水平方向放大 2 倍。

  4. fy=2: 垂直方向的缩放因子。这里设置为 2,表示垂直方向放大 2 倍。

因此,这行代码的作用是将输入图像 res 放大 2 倍,生成一个新的图像 res_1

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonOpenCV中实现直线检测,可以使用Hough变换来检测直线。Hough变换是一种常用的图像处理方法,可用于检测直线、圆等几何形状。 以下是一个简单的示例代码,使用Hough变换来检测直线并计算交点: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # Hough变换检测直线 lines = cv2.HoughLines(edges, 1, np.pi/180, 200) # 计算交点 points = [] for i in range(len(lines)): for j in range(i+1, len(lines)): rho1, theta1 = lines[i][0] rho2, theta2 = lines[j][0] if abs(theta1 - theta2) < np.pi/4: continue a = np.array([[np.cos(theta1), np.sin(theta1)], [np.cos(theta2), np.sin(theta2)]]) b = np.array([rho1, rho2]) x0, y0 = np.linalg.solve(a, b) points.append((int(x0), int(y0))) # 绘制直线和交点 for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2) for point in points: cv2.circle(img, point, 5, (0,255,0), -1) # 显示图像 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,首先读取图像并进行灰度转换和边缘检测。然后使用Hough变换检测直线,并计算交点。最后绘制直线和交点,并显示图像。 需要注意的是,在计算交点时,需要将两条直线的极坐标表示转换为直角坐标表示,并使用线性方程组求解。 希望这个例子能够帮助到你实现直线检测并计算交点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值