Python 图片转为矩阵,矩阵转为图片

 代码如下:

from PIL import Image
import numpy as np

path_rgb = Image.open('.png')#打开图片
path_normal = Image.open('.png')

# print("path_rgb:",path_img)
#输出:path_rgb: <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1280x720 at

img_rgb = np.asarray(path_rgb)#将输入的图片转为矩阵格式

# print(img_rgb)
#输出:图片的矩阵格式

# print("H W C:",img_rgb.shape)
#输出:H W C: (720, 1280, 3)

img_normal = np.asarray(path_normal)

total = img_rgb*0.5 + img_normal*0.5#矩阵相加

img = Image.fromarray(np.uint8(total*255))#矩阵转图片

img.show()#展示图片

原因:Image.open采用读入图片数组,注意这里读入的数组是 PIL.PngImagePlugin.PngImageFile型,是 uinit8 型的,范围是0-255。

其中,

Image.fromarray 归一化处理,就是实现array到image的转换

多写了一个深度图与RGB图融合的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import numpy as np
from PIL import Image as Img

rgb_ratio = 0.5
normal_ratio = 0.5

class image_converter:
    def __init__(self):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        # self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.rgb_sub = rospy.Subscriber("/camera/color/image_raw", Image, self.rgb_callback)
        self.depth_sub = rospy.Subscriber("/camera/depth/image_rect_raw", Image, self.depth_callback)

    def rgb_callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式

        rgb_image = self.bridge.imgmsg_to_cv2(data, "rgb8")
        # rgb_image = Img.fromarray(cv2.cvtColor(rgb_img, cv2.COLOR_BGR2RGB))
        # rgb_image = cv2.resize(rgb_img,(848,600))
        # rgb_image = rgb_image[120:600]
        # 显示Opencv格式的图像
        # cv2.imshow("Image window1", rgb_image)
        # cv2.waitKey(3)
        global rgb_array
        rgb_array = np.asarray(rgb_image)
        
        # 再将opencv格式额数据转换成ros image格式的数据发布
        # try:
        #     self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        # except CvBridgeError as e:
        #     print (e)

    def depth_callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式

        depth_image = self.bridge.imgmsg_to_cv2(data, "16UC1")
        M = np.float32([[1, 0, -36], [0, 1, 0]]) #深度图向左移动对齐
        depth_image = cv2.warpAffine(depth_image, M, (depth_image.shape[1], depth_image.shape[0]))
        
        # cv2.imshow("Image window2", depth_image)
        # cv2.waitKey(3)
        rows, cols = depth_image.shape

        x, y = np.meshgrid(np.arange(cols), np.arange(rows))
        x = x.astype(np.float32)
        y = y.astype(np.float32)

        # Calculate the partial derivatives of depth with respect to x and y
        dx = cv2.Sobel(depth_image, cv2.CV_32F, 1, 0)
        dy = cv2.Sobel(depth_image, cv2.CV_32F, 0, 1)

        # Compute the normal vector for each pixel
        normal = np.dstack((-dx, -dy, np.ones((rows, cols))))
        norm = np.sqrt(np.sum(normal**2, axis=2, keepdims=True))
        normal = np.divide(normal, norm, out=np.zeros_like(normal), where=norm != 0)

        # Map the normal vectors to the [0, 255] range and convert to uint8
        normal = (normal + 1) * 127.5
        normal = normal.clip(0, 255).astype(np.uint8)

        # Save the normal map to a file
        normal_image = cv2.cvtColor(np.uint8(normal), cv2.COLOR_RGB2BGR)
        # normal_image = Img.fromarray(cv2.cvtColor(normal_img, cv2.COLOR_BGR2RGB))
        global normal_array
        normal_array = np.asarray(normal_image)                       
        # print(normal_array)
        # 再将opencv格式额数据转换成ros image格式的数据发布
        # try:
        #     self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        # except CvBridgeError as e:
        #     print (e)

    # def __del__(self):
        total_array = rgb_array * rgb_ratio + normal_array * normal_ratio
        total_img = Img.fromarray(np.uint8(total_array)).convert('RGB')
        # total_img.show()
        show_img = cv2.cvtColor(np.uint8(total_img), cv2.COLOR_RGB2BGR)
        cv2.imshow("Image window", show_img)
        cv2.waitKey(3)
        # print (total_array)

if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print ("Shutting down cv_bridge_test node.")
        cv2.destroyAllWindows()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图片转为灰阶矩阵是一种常见的图像处理操作,Python中有多种方法可以实现这个功能。以下是一种常见的方法: 首先,需要导入Python图像处理库PIL(Python Imaging Library)。如果没有安装该库,可以使用以下命令进行安装: ``` pip install pillow ``` 导入PIL库后,可以使用`Image.open()`方法打开一张图片。例如,假设要转换的图片名为`image.jpg`,可以使用以下代码进行打开: ```python from PIL import Image image = Image.open('image.jpg') ``` 接下来,可以使用`convert()`方法将图片转换为灰阶图像。默认情况下,转换为灰阶图像后,每个像素值的范围将从0到255。代码如下: ```python gray_image = image.convert('L') ``` 最后,可以将灰阶图像转换为矩阵形式。可以使用`numpy`库将灰阶图像转换为矩阵,然后可以使用`ndarray`的`tolist()`方法将矩阵转换为列表。代码如下: ```python import numpy as np gray_matrix = np.array(gray_image) gray_matrix_list = gray_matrix.tolist() ``` 现在,`gray_matrix_list`就是将图片转换为灰阶矩阵后得到的结果。你可以在后续的代码中使用`gray_matrix_list`进行进一步的处理。 总结起来,将图片转换为灰阶矩阵的步骤主要包括导入PIL库、打开图片、转换为灰阶图像、将灰阶图像转换为矩阵和列表。以上是其中一种常见的方法,根据实际需求,也可以选择其他方法来实现同样的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值