设为首页收藏本站 |天气与日历| 2025-08-23 星期六 01:16:00 乙巳(蛇)年 七月初一 丑时 处暑
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 394|回复: 0

图像操作

[复制链接]

954

主题

954

帖子

3879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3879
发表于 2022-2-20 18:05:53 | 显示全部楼层 |阅读模式
读写像素

读一个GRAY像素点的像素值(CV_8UC1)
Scalar intensity = img.at<uchar>(y, x);
或者 Scalar intensity = img.at<uchar>(Point(x, y));


读一个RGB像素点的像素值
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];


灰度图像
img.at<uchar>(y, x) = 128;

RGB三通道图像
img.at<Vec3b>(y,x)[0]=128; // blue
img.at<Vec3b>(y,x)[1]=128; // green
img.at<Vec3b>(y,x)[2]=128; // red

空白图像赋值
img = Scalar(0);

ROI选择
Rect r(10, 10, 100, 100);
Mat smallImg = img(r);


Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据
把CV_8UC1转换到CV32F1实现如下:
src.convertTo(dst, CV_32F);
反片效果的实现:
[C++] 纯文本查看 复制代码
/*
注意:  
1
处理像素时
 dst.at<uchar>(y, x);
 dst.at 访问像素数值时,应该注意第一个参数 是高度 第二个是宽度
如果x,y弄反了 像素数组处理时会访问越界,导致程序报错
2
#define MAKE_IMG 为选择性编译
*/
#include <opencv2/opencv.hpp>
#include <iostream>
#define MAKE_IMG 1  //如果为1则处理灰度图,如果不为1处理原图
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src;
        Mat dst;
        
        src = imread("D:/IDE/opencv-3.1.0/demo2.jpg");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("输入原图", CV_WINDOW_AUTOSIZE);
        imshow("输入原图", src);
        //调试输入图片
        
        #if(MAKE_IMG == 1)
        {
                cvtColor(src, dst, CV_BGR2GRAY);
        }

        #else
        {
                //src.copyTo(dst);
                dst.create(src.size(), src.type());
                src.copyTo(dst);
        }
        #endif

        //定义dst为src的灰度图(单通道)
        namedWindow("选择编译灰度图效果", CV_WINDOW_AUTOSIZE);
        imshow("选择编译灰度图效果", dst);
        //调试选择编译灰度图效果


        int height = dst.rows; //获取高度
        int width = dst.cols; //获取宽度

        ///////////////////////////////////////////////////

        int nc = dst.channels();


        for (int y = 0; y < height; y++)
        {
                //y为遍历的高度
                for (int x = 0; x < width; x++)
                {

                        if (nc == 1)/*单通道*/ 

                        {
                                int pixel = dst.at<uchar>(y, x);
                                dst.at<uchar>(y, x) = 255 - pixel;
                        }
                        else if (nc == 3)/*3通道*/
                        {
                                int b = dst.at<Vec3b>(y, x)[0];
                                int g = dst.at<Vec3b>(y, x)[1];
                                int r = dst.at<Vec3b>(y, x)[2];
                                dst.at<Vec3b>(y, x)[0] = 255 - b;
                                dst.at<Vec3b>(y, x)[1] = 255 - g;
                                dst.at<Vec3b>(y, x)[2] = 255 - r;
                        }

                }

        }

        namedWindow("反片效果", CV_WINDOW_AUTOSIZE);
        imshow("反片效果", dst);
        
        
        waitKey(0);
        return 0;
}

666.jpg

itwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1
————————————————


[C++] 纯文本查看 复制代码
/*
注意:  
1
bitwise_not 的直接调用
*/
#include <opencv2/opencv.hpp>
#include <iostream>
#define MAKE_IMG 1  //如果为1则处理灰度图,如果不为1处理原图
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src;
        Mat dst;
        
        src = imread("D:/IDE/opencv-3.1.0/demo2.jpg");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("输入原图", CV_WINDOW_AUTOSIZE);
        imshow("输入原图", src);
        //调试输入图片
        
        #if(MAKE_IMG == 1)
        {
                cvtColor(src, dst, CV_BGR2GRAY);
        }

        #else
        {
                //src.copyTo(dst);
                dst.create(src.size(), src.type());
                src.copyTo(dst);
        }
        #endif

        namedWindow("选择编译灰度图效果", CV_WINDOW_AUTOSIZE);
        imshow("选择编译灰度图效果", dst);
        //调试选择编译灰度图效果

        bitwise_not(src,dst);//反位操作,函数调用一步到位,单通道和多通道通杀

        namedWindow("反片效果", CV_WINDOW_AUTOSIZE);
        imshow("反片效果", dst);
        
        
        waitKey(0);
        return 0;
}









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-8-23 01:16 , Processed in 0.086667 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表