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

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

1. 图像加载与显示

python 复制代码
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)。
python 复制代码
# 创建一个 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. 图像预处理

python 复制代码
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. 掩膜处理与图像大小调整

python 复制代码
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. 二值化处理

python 复制代码
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. 图像合成

python 复制代码
show_image = np.ones([*new_image.shape[:2], 3])
plt.imshow(show_image.astype(np.uint8), cmap="gray")
  • 创建一个全为1的三通道(RGB)图像,并通过 imshow() 显示出来。
python 复制代码
show_image = show_image * 255
  • 将图像 show_image 的值乘以255,生成一个白色背景的 RGB 图像。
python 复制代码
show_image[new_image == 255] = (31, 41, 55)
  • new_image 中像素值为 255 的区域的 RGB 值设置为 (31, 41, 55)(一个深蓝色)。
python 复制代码
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. 三维坐标系绘制

python 复制代码
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 图像。
  • 绘制三个不同颜色的轴线来表示电塔(红色)、绝缘子(绿色)和输电线(蓝色)。
python 复制代码
plt.savefig('D:/papers/picture/coords.png')
  • 保存绘制的三维坐标系图像。

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

python 复制代码
img = Image.open('D:/papers/picture/show_image.png').convert("RGBA")
  • 使用 PIL 打开生成的图像,并转换为 RGBA 模式(带透明通道)。
python 复制代码
# 遍历图像数据,将白色像素转换为透明
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. 前景与背景合成

python 复制代码
background = Image.open('D:/papers/picture/coords.png').convert("RGBA")
foreground = Image.open('D:/papers/picture/output.png').convert("RGBA")
  • 打开背景图像和前景图像(带透明通道的 PNG),并转换为 RGBA 模式。
python 复制代码
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. 裁剪白色边缘

python 复制代码
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. 保存并展示合成后的图像

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

总结:

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

相关推荐
ZHOU_WUYI4 小时前
3.langchain中的prompt模板 (few shot examples in chat models)
人工智能·langchain·prompt
如若1234 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
老艾的AI世界4 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK221514 小时前
机器学习系列----关联分析
人工智能·机器学习
Robot2514 小时前
Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速
人工智能·机器人·微信公众平台
浊酒南街5 小时前
Statsmodels之OLS回归
人工智能·数据挖掘·回归
畅联云平台6 小时前
美畅物联丨智能分析,安全管控:视频汇聚平台助力智慧工地建设
人工智能·物联网
加密新世界6 小时前
优化 Solana 程序
人工智能·算法·计算机视觉
hunteritself6 小时前
ChatGPT高级语音模式正在向Web网页端推出!
人工智能·gpt·chatgpt·openai·语音识别
Che_Che_6 小时前
Cross-Inlining Binary Function Similarity Detection
人工智能·网络安全·gnn·二进制相似度检测