lovejobs

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  138 随笔 :: 3 文章 :: 46 评论 :: 28万 阅读

1.图像是由像素组成的,所以修改了像素就可以实现图像的改变。

2先看灰度图像(单通道):

*****2.获取灰度图像的像素值使用:  int gray = gray_src.at<uchar>(row, col);

*****3.修改灰度图像的像素值使用:gray_src.at<uchar>(row, col) = 255 - gray;//对每一个像素取反

*****源代码,对灰度图像像素值全部取反

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
#include<opencv2\opencv.hpp>
#include<iostream>
 
using namespace std;
using namespace cv;
/*图像操作*/
int main(int argc, char **argv)
{
    Mat src = imread("E:\\vsprom\\learn02\\nv1.jpg");
    if (src.empty())
    {
        cout << "can not load imagefile...." << endl;
        return -1;
    }
    namedWindow("in image win", CV_WINDOW_AUTOSIZE);
    imshow("in image win", src);
 
     
    /*将一个RGB图像转为GRAY图像*/
    Mat gray_src;
    cvtColor(src,gray_src,CV_BGR2GRAY);
 
 
    int height = gray_src.rows;
    int width = gray_src.cols;
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int gray = gray_src.at<uchar>(row, col);/*读取一个GRAY像素点的像素值(CV_8UC1)*/
            gray_src.at<uchar>(row, col) = 255 - gray;//对每一个像素取反
        }
    }
    namedWindow("gray image win", CV_WINDOW_AUTOSIZE);
    imshow("gray image win", gray_src);
 
 
    waitKey(0);
    return 0;
}

  效果图:

3.RGB图像的像素操作

读像素值

int b = src.at<Vec3b>(row, col)[0];//第一个通道
int g = src.at<Vec3b>(row, col)[1];//第二个通道
int r = src.at<Vec3b>(row, col)[2];//第三个通道

修改像素值
dst.at<Vec3b>(row, col)[0] = 255 - b;
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;

源代码实例:

复制代码
    /*获取RGB的像素值*/
    Mat dst;
    dst.create(src.size(), src.type());
    int height = dst.rows;
    int width = dst.cols;
    int cn = src.channels();//通道数

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            if (cn == 1)
            {
                int gray = dst.at<uchar>(row, col);/*读取一个GRAY像素点的像素值(CV_8UC1)*/
                dst.at<uchar>(row, col) = 255 - gray;//对每一个像素取反

            }
            else if(cn==3)
            {
                int b = src.at<Vec3b>(row, col)[0];//第一个通道
                int g = src.at<Vec3b>(row, col)[1];//第二个通道
                int r = src.at<Vec3b>(row, col)[2];//第三个通道
                dst.at<Vec3b>(row, col)[0] = 255 - b;
                dst.at<Vec3b>(row, col)[1] = 255 - g;
                dst.at<Vec3b>(row, col)[2] = 255 - r;
            }

        }
    }
    namedWindow("rgb image win", CV_WINDOW_AUTOSIZE);
    imshow("rgb image win", dst);
复制代码

产看输出效果图

posted on   lovejobs  阅读(519)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示