实现了图像处理、绘制三维坐标系以及图像合成的操作
这段代码实现了图像处理、绘制三维坐标系以及图像合成的操作,具体步骤如下:
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
- 将
mask
和jiazi_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)!