自学内容网 自学内容网

实现了图像处理、绘制三维坐标系以及图像合成的操作

这段代码实现了图像处理、绘制三维坐标系以及图像合成的操作,具体步骤如下:

1. 图像加载与显示

image = cv2.imread("D:/papers/picture/foreground.png")
mask = cv2.imread("D:/papers/picture/insulator.jpg")
jiazi_mask = cv2.imread("D:/papers/picture/6201726039514_.pic.jpg")
  • 使用 OpenCV 的 cv2.imread() 方法加载三张图像,分别是前景图(foreground.png),绝缘子掩膜(insulator.jpg),以及夹子掩膜(jiazi_mask.jpg)。
# 创建一个 1 行 3 列的子图
plt.figure(figsize=(15, 5))

plt.subplot(1, 3, 1)
plt.imshow(image)
plt.title("Foreground")
plt.axis('off')

plt.subplot(1, 3, 2)
plt.imshow(mask)
plt.title("Insulator Mask")
plt.axis('off')

plt.subplot(1, 3, 3)
plt.imshow(jiazi_mask,cmap='gray')
plt.title("Jiazi Mask")
plt.axis('off')

plt.tight_layout()
plt.show()
  • 将这三张图像放在一个 1 行 3 列的子图中进行显示,图像分别是前景、绝缘子掩膜和夹子掩膜。

2. 图像预处理

image = np.mean(image, axis=2)  # 将架子的图像按通道数进行求平均,将图片压扁, 得到单通道的图像。
new_image = np.random.rand(*image.shape[:2])  # 随机生成与原始图像相同尺寸大小的新的图像。
new_image[image == 0] = 0  # 按照image图像中的像素值为0的位置,将新的图像置0,保留其它的像素值。
  • image 转换为单通道图像(灰度图),通过取三通道(RGB)的均值。
  • 创建一个与图像 image 同样尺寸的随机图像,并在 image 中像素值为0的位置将其置为0。

3. 掩膜处理与图像大小调整

insulator = cv2.resize(mask, (1152, 864))
insulator = np.mean(insulator, axis=2)
insulator[insulator != 255] = 0

jiazi_mask = cv2.resize(jiazi_mask, (1152, 864))
jiazi_mask = np.mean(jiazi_mask, axis=2)
jiazi_mask[jiazi_mask != 255] = 0
  • maskjiazi_mask 调整为 1152x864 的尺寸,并通过 np.mean() 转换为灰度图。
  • 将这些掩膜中值不为255的像素值设为0,保留掩膜区域。

4. 二值化处理

threshold = 1
new_image[new_image < threshold] = 0
new_image[new_image > threshold] = 255
new_image = new_image.astype(np.uint8)
  • new_image 二值化,设定阈值为1,将大于1的像素设为255,小于1的像素设为0,最终将图像转为 uint8 类型。

5. 图像合成

show_image = np.ones([*new_image.shape[:2], 3])
plt.imshow(show_image.astype(np.uint8), cmap="gray")
  • 创建一个全为1的三通道(RGB)图像,并通过 imshow() 显示出来。
show_image = show_image * 255
  • 将图像 show_image 的值乘以255,生成一个白色背景的 RGB 图像。
show_image[new_image == 255] = (31, 41, 55)
  • new_image 中像素值为 255 的区域的 RGB 值设置为 (31, 41, 55)(一个深蓝色)。
show_image[np.logical_and((insulator == 255), new_image != 0)] = (0, 255, 0)
show_image[np.logical_and((jiazi_mask == 255), new_image != 0)] = (0, 0, 255)
  • 将掩膜 insulator 中像素为255的位置的区域设置为绿色 (0, 255, 0)
  • 将掩膜 jiazi_mask 中像素为255的位置的区域设置为蓝色 (0, 0, 255)

6. 三维坐标系绘制

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')

ax.plot([0, 1], [0, 0], [0, 0], color='r', label="tower")
ax.plot([0, 0], [0, 1], [0, 0], color='g', label="insulator")
ax.plot([0, 0], [0, 0], [0, 1], color='b', label="transmission line")
  • 使用 matplotlib 的三维坐标系模块 Axes3D 创建一个 3D 图像。
  • 绘制三个不同颜色的轴线来表示电塔(红色)、绝缘子(绿色)和输电线(蓝色)。
plt.savefig('D:/papers/picture/coords.png')
  • 保存绘制的三维坐标系图像。

7. 图像合成与透明化处理

img = Image.open('D:/papers/picture/show_image.png').convert("RGBA")
  • 使用 PIL 打开生成的图像,并转换为 RGBA 模式(带透明通道)。
# 遍历图像数据,将白色像素转换为透明
new_data = []
for item in data:
    if item[:3] == (255, 255, 255):
        new_data.append((255, 255, 255, 0))
    else:
        new_data.append(item)
img.putdata(new_data)
  • 遍历图像数据,将所有白色像素(255, 255, 255)转换为透明。

8. 前景与背景合成

background = Image.open('D:/papers/picture/coords.png').convert("RGBA")
foreground = Image.open('D:/papers/picture/output.png').convert("RGBA")
  • 打开背景图像和前景图像(带透明通道的 PNG),并转换为 RGBA 模式。
background = background.resize((int(fg_width * 2.5), int(fg_height * 2.5)))
position = ((bg_width - fg_width) // 2, (bg_height - fg_height) // 2)
background.paste(foreground, position, foreground)
  • 将背景图像的大小调整为前景图像的 2.5 倍,并将前景图像粘贴到背景图像的中央,使用前景图像的 alpha 通道作为掩码。

9. 裁剪白色边缘

min_x, min_y = bg_width, bg_height
max_x, max_y = 0, 0

for y in range(bg_height):
    for x in range(bg_width):
        pixel = background_data[y * bg_width + x]
        if pixel[0] < 255 or pixel[1] < 255 or pixel[2] < 255:  # 非白色
            if x < min_x: min_x = x
            if x > max_x: max_x = x
            if y < min_y: min_y = y
            if y > max_y: max_y = y
  • 遍历背景图像数据,找到非白色区域的边界,并进行裁剪。

10. 保存并展示合成后的图像

cropped_background.save('combined_cropped.png')
plt.imshow(cropped_background)
plt.axis('off')
plt.show()
  • 保存裁剪后的合成图像,并展示。

总结:

这段代码综合使用了图像预处理、掩膜操作、图像合成、三维坐标系绘制、透明化处理等技术,最终实现了图像的合成与裁剪,并将其保存为一个新的 PNG 图像。


原文地址:https://blog.csdn.net/weixin_50563385/article/details/143867289

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!