• 图像处理算法实战【2】读取图片并获取指定像素位置的RGB值


    本篇文章旨在通过详细的逐行注释,介绍如何分别使用 C/C++/Python 读取图片并获取指定像素位置的RGB值,其中C语言通过算法源码实现,C++和Python通过Opencv实现。

    Python实现

    from PIL import Image
    import matplotlib.pyplot as plt
    filename = "demo.jpg"  # 图片文件路径
    
    # 打开图像
    image = Image.open(filename)
    
    # 获取图像的宽度和高度
    width, height = image.size
    
    x = 100  # 像素位置的x坐标
    y = 100  # 像素位置的y坐标
    
    # 判断像素位置是否有效
    if x >= 0 and x < width and y >= 0 and y < height:
        # 获取指定像素位置的RGB值
        r, g, b = image.getpixel((x, y))
        print(f"Pixel value at ({x}, {y}): R={r}, G={g}, B={b}")
    else:
        print("Invalid pixel position.")
    
    # 显示图像
    plt.imshow(image)
    plt.axis('off')
    plt.show()
    
    # 关闭图像
    image.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在这里插入图片描述

    C实现

    #include 
    #include "stb_image.h"
    
    #define STB_IMAGE_IMPLEMENTATION
    
    // Image结构体,用于存储图像相关的信息和数据
    typedef struct {
        int width;  //图像宽度
        int height; //图像高度
        int channels;  //图像通道数
        unsigned char* data;  //图像数据指针
    } Image;
    
    // 读取JPEG图像文件,并将图像数据存储在Image结构体
    Image* readJPEG(const char* filename) {
        int width, height, channels;
        // 从指定的JPEG图像文件中加载图像数据
        unsigned char* image_data = stbi_load(filename, &width, &height, &channels, 0);
        // 如果加载失败,函数将打印错误消息并返回NULL
    
        if (image_data == NULL) {
            printf("Failed to load image file.\n");
            return NULL;
        }
        // 如果加载成功,函数将分配一个Image结构体的内存空间,并将图像的宽度、高度、通道数和数据指针设置为相应的值
        Image* image = (Image*)malloc(sizeof(Image));
        image->width = width;
        image->height = height;
        image->channels = channels;
        image->data = image_data;
    
        return image;
    }
    
    // 获取指定像素位置的RGB值
    void getPixelValue(Image* image, int x, int y, unsigned char* r, unsigned char* g, unsigned char* b) {
        int index = (y * image->width + x) * image->channels;
        *r = image->data[index];         // 红色通道值
        *g = image->data[index + 1];     // 绿色通道值
        *b = image->data[index + 2];     // 蓝色通道值
    }
    
    int main() {
        const char* filename = "demo.jpg";  // 图片文件路径
    
        // 读取JPEG图像
        Image* image = readJPEG(filename);  // 调用自定义函数readJPEG读取JPEG图像
        if (image == NULL) {
            return 1;
        }
    
        int x = 100;  // 像素位置的x坐标
        int y = 100;  // 像素位置的y坐标
        unsigned char r, g, b;
    
        if (x >= 0 && x < image->width && y >= 0 && y < image->height) {
            // 调用getPixelValue获取指定像素位置的RGB值
            getPixelValue(image, x, y, &r, &g, &b);
            printf("Pixel value at (%d, %d): R=%d, G=%d, B=%d\n", x, y, r, g, b);
        } else {
            printf("Invalid pixel position.\n");
        }
    
        stbi_image_free(image->data);  // 释放图像数据内存
        free(image);                   // 释放图像结构体内存
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    C++实现

    #include 
    #include 
    
    int main() {
        std::string filename = "demo.jpg";  // 图片文件路径
    
        // 读取图像
        cv::Mat image = cv::imread(filename);
        if (image.empty()) {
            std::cout << "Failed to load image file." << std::endl;
            return 1;
        }
    
        int x = 100;  // 像素位置的x坐标
        int y = 100;  // 像素位置的y坐标
    
        // 判断像素位置是否有效
        if (x >= 0 && x < image.cols && y >= 0 && y < image.rows) {
            cv::Vec3b pixel = image.at(y, x);
            int r = pixel[2];
            int g = pixel[1];
            int b = pixel[0];
            std::cout << "Pixel value at (" << x << ", " << y << "): R=" << r
                << ", G=" << g << ", B=" << b << std::endl;
        }
        else {
            std::cout << "Invalid pixel position." << std::endl;
        }
    
        // 显示图像
        cv::imshow("Image", image);
        cv::waitKey(0);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    两张图完全理解单点登录
    fiddler导出录制脚本并导出jmter脚本文件
    小红书账号管理软件,批量账号发布笔记!
    python数据库连接池的正确用法
    TextChanged
    GBase 8s静默安装
    通过源码来理解Cglib与JDK动态代理
    Spark SQL_第六章笔记
    3天快速入门python机器学习(黑马xxx)
    前端html实现带行号的文本编辑器
  • 原文地址:https://blog.csdn.net/xu1129005165/article/details/132742909