精华内容
下载资源
问答
  • 像素值取反
    千次阅读
    2019-01-02 15:17:38

    像素的操作

    对像素进行操作,我们自然想到首先要提取像素点,上一篇文章中我们利用了Mat对象的ptr()函数可以返回一个指针类型的像素点,但是对指针进行操作似乎总是不和我们的常规,感觉有些危险。。。所以这篇文章主要用到at()函数

    关于at():
    at<template>(i,j) 代表读取某Mat对象的 i 行 j 列像素点,且返回值可变,不牵涉指针操作。
    示例如下:

    1.对图像的像素值进行反差

    这个操作牵涉到图片的色彩空间,如果图片是三维,即rgb色彩空间,那么像素点数据类型不为uchar,而应该是Vec3b或Vec3f。(Vec3b对应 bgr的uchar类型、Vec3f对应 bgr的float类型)

    #include <opencv2\opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char** argv) {
    	Mat src = imread("E:/images/timg.jpg");
    	if (src.empty()) {
    		cout << "could not be found" << endl;
    		return -1;
    	}
    	namedWindow("output", CV_WINDOW_AUTOSIZE);
    	imshow("output", src);
    	
    	Mat dst;
    	dst.create(src.size(), src.type()); // 用到了上一篇文章中的构造函数
    	int nc = src.channels();
    	cout << nc << endl;
    	
    	// 对src进行反差  即三维色彩空间
    	for (int row = 0; row < height; row++) {
    		for (int col = 0; col < width; col++) {
    			if (nc == 1) {
    				// 对一维色彩空间进行反差
    				int gray = src.at<uchar>(row, col); //获取像素值
    				dst.at<uchar>(row, col) = 255 - gray;
    			}
    			else if (nc == 3) {
    			// Vec3b对应 bgr的uchar类型
    			// Vec3f对象 bgr的float类型
    
    				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;
    				//dst.at<Vec3b>(row, col)[2] = 255 - r;
    			}
    			
    		}
    	}
    	imshow("output3", dst);
    	Mat m1 = Mat::zeros(src.size(),src.type());
    	// 将CV_8UC1 转换为CV_32F  即从uchar转换为float32
    	src.convertTo(m1, CV_32F);
    	imshow("output4", m1);
    	waitKey(0);
    	return 0;
    }
    

    上面写的两个for循环可不写,因为反差实质为位运算取反,可用一个api搞定。

    	//一个api搞定
    	bitwise_not(src, dst);  // 反位操作  相当于位运算
    

    2.两张图片的混合

    这里的混合方法为线性混合运算(带权值)。
    F ( x , y ) = a l p h a ∗ f ( x , y ) + ( 1 − a l p h a ) ∗ g ( x , y ) F(x,y) = alpha * f(x, y) + ( 1 - alpha ) * g(x ,y) F(x,y)=alphaf(x,y)+(1alpha)g(x,y)
    alpha属于0-1,即代表两张图混合时哪张图占的比例更大。f(x, y)、g(x ,y)分别代表src1、src2,即混合运算的两个对象,F(x,y)代表混合后生成的图片。运算对象自然是两个图片的像素值。代码如下:

    #include <opencv2\opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    // 图片的混合
    int main(int argc, char** argv) {
    	Mat src1 = imread("E:/images/0.jpg");
    	Mat src2 = imread("E:/images/1.jpg");
    	if (src1.empty() || src2.empty()) {
    		cout << "could not be found " << endl;
    		return -1;
    	}
    	namedWindow("output01", CV_WINDOW_NORMAL);
    	imshow("output01", src1);
    	namedWindow("output02", CV_WINDOW_NORMAL);
    	imshow("output02", src2);
    	Mat dst = Mat::zeros(src1.size(), src1.type());
    	double alpha = 0.5; // 代表权重
    	if (src1.cols == src2.cols && src1.rows == src2.rows && src1.type() == src2.type()) {
    		addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst) ;// 像素相加  线性混合 
    		// multiply(src1, src2, dst, 1.0); // 像素相乘
    		namedWindow("output03", CV_WINDOW_AUTOSIZE);
    		imshow("output03", dst);
    	}
    
    	waitKey(0);
    
    	return 0;
    }
    
    更多相关内容
  • 遍历像素是利用了两个for循环,将行,列的每个像素点遍历,进入循环后 通过if语句来判断图片是彩色图像,还是灰度图像,这里是利用...左图为原图,右图是像素值取反后的结果,可以看出黑色头发变为白色。.........

    下面直接来看代码

    #include<iostream>
    #include<opencv2\opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
        Mat img;
        img = imread("D:/photogallery/image_4.png");
        if (img.empty())
        {
            cout << "读入失败" << endl;
            return -1;
        }
        imshow("图片4", img);
        
        for (int row = 0; row < img.rows; row++)
        {
            for (int col = 0; col<img.cols; col++)
            {
                if (img.channels() == 1)//灰度图片
                {
                    int pv = img.at<uchar>(row, col);
                    img.at<uchar>(row, col) = 255 - pv;
                }
                
                if (img.channels() == 3)//BGR图片
                {
                    Vec3b bgr = img.at<Vec3b>(row, col);
                    img.at<Vec3b>(row, col)[0] = 255 - bgr[0];
                    img.at<Vec3b>(row, col)[1] = 255 - bgr[1];
                    img.at<Vec3b>(row, col)[2] = 255 - bgr[2];
                }
            }
        }
        /*int dims = img.channels();
        
        for (int row = 0; row < img.rows; row++)
        {
        uchar*current_row = img.ptr<uchar>(row);
        for (int col = 0; col <img.cols; col++)
        {
        if (dims == 1)
        {
        int pv = *current_row;
        *current_row  ++= 255 - pv;
        }
        
        if (dims == 3)
        {
        Vec3b bgr = img.at<Vec3b>(row, col);
        *current_row++ = 255 - *current_row;
        *current_row++ = 255 - *current_row;
        *current_row++ = 255 - *current_row;
        }
        }
        }*/
        imshow("像素读写", img);
        
        waitKey(0);
        system("pause");
        return 0;
    }
    

    代码运行结果如下:

    在这里插入图片描述

    左图为原图,右图是像素值取反后的结果,可以看出黑色头发变为白色。

    遍历像素是利用了两个for循环,将行,列的每个像素点遍历,进入循环后 通过if语句来判断图片是彩色图像,还是灰度图像,这里是利用channels()通道数来判断的,当然如果你知道自己是什么图像也可不用判断。


    单通道代码解读(if (img.channels() == 1)):
    int pv = img.at(row, col);
    这句是获得当前的像素点 ,调用对象的at模板,<>里是像素的数据类型,为了像素值的取反,将其赋给int类型的pv。

    img.at(row, col) = 255 - pv;
    因为像素值在0~255,所以用255减去目前的像素值,实现取反,再利用赋值操作赋给图像。

    彩图图代码解读(if (img.channels() == 3)
    Vec3b bgr = img.at(row, col);
    在opencv中彩色图的像素类型专用Vec3b,你可以把这个类型看成一个数组。

    img.at(row, col)[0] = 255 - bgr[0];
    img.at(row, col)[1] = 255 - bgr[1];
    img.at(row, col)[2] = 255 - bgr[2];
    因为是三通道,所以数组元素下标为 0,1,2。将其取反后,分别赋值回去。

    展开全文
  • Python对图片进行像素取反(numpy和PIL)

    千次阅读 2020-05-16 21:24:55
    变换后\color{Red}变换后变换后 from PIL import Image import numpy as np//导入库,没什么说的 im=np.array(Image.open("D:\ChromeDownload\艾米莉亚膝枕.jpg")) b=[255,255,255]-im//对im图像的RGB值取反,因为RGB...

    由 于 图 片 都 是 由 R G B 矩 阵 组 成 由于图片都是由RGB矩阵组成 RGB

    所 以 可 以 通 过 构 建 矩 阵 形 成 新 的 图 片 所以可以通过构建矩阵形成新的图片

    变 换 前 \color{Red}变换前

    变 换 后 \color{Red}变换后

     from PIL import Image
     import numpy as np//导入库,没什么说的
     
     im=np.array(Image.open("D:\ChromeDownload\艾米莉亚膝枕.jpg"))
     
     b=[255,255,255]-im//对im图像的RGB值取反,因为RGB最大是255
     
     new=Image.fromarray(b.astype('uint8'))//生成图片
     
     new.save('D:\ChromeDownload\艾米莉亚.jpg')//保存图片
    

    也可以把图片变成灰色

    import numpy as np
    from PIL import Image
    
    a=np.array(Image.open("D:\ChromeDownload\艾米莉亚膝枕.jpg").convert('L'))//打开图片时候用convert('L')方法转换为灰点
    b=255-a//转换为灰点后不是RGB模式了,只能用1个255减
    new=Image.fromarray(b.astype('uint8'))//生成图片
    new.save("D:\ChromeDownload\艾米莉亚灰色.jpg")
    
    
    展开全文
  • opencv 像素数据取反

    2019-03-05 23:10:00
    获取像素指针 p2 = out_img.ptr (row); for ( int col = 0 ; col ; col++ ) { *p2 = 255 - *p1; // 取反 p2++ ; p1 ++ ; } } imshow( " in_img " , in_img); imshow( " out_img " , out_img);...
    #include<opencv2\opencv.hpp>
    #include<highgui.h>
    
    using namespace cv;
    
    
    int main(int argc, char** argv)
    {
    
        Mat in_img = imread("D:/vcprojects/images/123.jpg");
    
        Mat out_img;
        in_img.copyTo(out_img);
    
        int channels = in_img.channels();
        int rows = in_img.rows;
        int cols = in_img.cols * channels;
        if (in_img.isContinuous()) {
            cols *= rows;
            rows = 1;
        }
    
        uchar* p1;
        uchar* p2;
        for (int row = 0; row < rows; row++) {
            p1 = in_img.ptr<uchar>(row);    // 获取像素指针
            p2 = out_img.ptr<uchar>(row);
            for (int col = 0; col < cols; col++) {
                *p2 = 255 - *p1; // 取反
                p2++;
                p1++;
            }
        }
    
        imshow("in_img", in_img);
        imshow("out_img", out_img);
    
        waitKey(0);
        
        return 0;
    }

     

    转载于:https://www.cnblogs.com/hehe2014/p/10480494.html

    展开全文
  • opencv像素取反函数

    2021-01-19 21:52:25
    opencv像素取反函数 #include<iostream> #include<opencv2/opencv.hpp>...不过中心思想是利用255-当前像素值=取反值,即白变成黑 Mat src; src=imread("图片存储位置"); if(!src.data) { printf("com
  • 给Image类添加一个单目运算符“-”,作用是图像的像素值取反,即黑的变成白的,白的变成黑的。再给Image类添加一个成员函数gray2bw,该函数以给定的阈值参数把灰度图像转化为二值图像。假设图像的像素值范围在[0,1]...
  • image[row, col, c] = 255 - pv#像素取反,修改每个像素点每个通道灰度 cv.imshow("pixels_demo", image) def create_image(): img = np.zeros([400, 400, 3], np.uint8)#创建一个三维数组高400,宽400,...
  • C++实验4——运算符重载

    千次阅读 2022-01-18 13:01:48
    实验目的 掌握运算符重载 实现对Matrix类的运算符重载 实验内容 在之前的实验中,我们实现了矩阵类Matrix及其子类Image。本次实验我们给Matrix类添加...给Image类添加一个单目运算符“-”,作用是图像的像素值取反
  • 本段代码所计算的其实并不是完全反相所有像素灰度,一般反相是用255减去图片中每一个像素灰度所剩下的即为反相,但本段代码示例中,使用的是图片中最大与最小灰度作为图片灰度上限,反相结果为新的灰度...
  • Python opencv(四) 像素取反

    千次阅读 2020-06-08 11:07:25
    前提条件 使用工具python3.x 使用库numpy;opencv, api简介 1.cv.floodFill 对所选某一区域进行填充颜色,参数...def accessPixels(image): # 像素取反自定义函数 print(image.shape) height = image.shape[0] wid
  • 图像像素取反

    千次阅读 2018-12-22 09:58:55
    1 void cvNot( const CvArr* src, ...因此,一个为0x00的8位图像将被映射到0xff,而为0x83的图像将被映射到0x7c。 #include &lt;stdio.h&gt; #include &lt;opencv2\opencv.hpp&gt; int m...
  • 读写灰度图像,RGB图像的某个像素、修改像素值、图像取反(源码+API)
  • opencv 两种方法实现像素取反--python

    千次阅读 2019-09-27 14:36:01
    源码: 方法一: import cv2 as cv ...# 像素取反 def get_img_info(img): height = img.shape[0] # 高 width = img.shape[1] #宽 channels = img.shape[2] #通道数 #将图像的每个像素点进行反选操作...
  • Canny边缘检测。 #include #include #include using namespace std; using namespace cv; int threshold_value = 100, threshold_max = 255;... //dst按照像素值取反 waitKey(0); return 0; }
  • VC编程实现位图图像二化、反相

    千次阅读 2015-05-05 14:21:04
    VC编程进行位图的像素操作(灰度化)介绍了VC对位图图像灰度化处理,本文继续介绍位图处理类CImageUtility的其它成员方法,限于篇幅,本文着重介绍VC编程实现图像二化、位图反相的算法和具体实现。 1. 图像二化...
  • opencv(3)图像像素取反

    千次阅读 2019-05-12 12:55:03
    1.图像取反 import cv2 as cv # 索引是[i,j,k] 这样写的 而不是[i:j:k] 这样写的 def access_pixels(img): s = img.shape for i in range(s[0]): for j in range(s[1]): for k in range(s[2]): ...
  • OpenCV-python基础操作之图像像素取反+显示程序运行消耗时间 代码: # 代码描述:对表示像素的数组进行操作,遍历像素进行取反,添加显示程序运行消耗的时间 # # 创建时间: 2020-09-01 # 创建人: Kenn Wu # 修改...
  • opencv修改像素值

    千次阅读 2019-11-13 20:00:13
    Mat对象读取图片,用矩阵(二维数组)储存图片的像素值 #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Mat src = imread("D:/image/1....
  • Python-opencv学习第十三课:图像像素值统计 文章目录Python-opencv学习第十三课:图像像素值统计一、学习部分二、代码部分1.引入库2.读入原始图片并定义图像像素函数,计算均值与方差3.完整代码三、运行结果总结 ...
  • opencv--像素值的读写

    2018-11-10 19:07:08
    像素值的读写 我们需要读取某个像素值,或者设置某个像素值;在更多的时候,我们需要对整个图像里的所有像素进行遍历。OpenCV 提供了多种方法来实现图像的遍历。 at()函数 函数at()用于读取矩阵中的某个像素,或者...
  • Problem A: 整型数组运算符重载

    千次阅读 2017-05-06 19:03:19
    (2)两个对象的length相同,且mems中对应元素的相同。其他情况均为不相等。 4. 利用友元函数重载和>>运算符。输入、输出格式见下。 Input 输入分多行。 第一行是一个正整数M,表示有M个数组。 ...
  • OpenCV图像取反

    千次阅读 2018-06-07 22:55:06
    所谓图像取反,就是将RGB图像的每个像素点(r, g, b),使用(255 - r, 255 - g, 255 - b)替换。对于灰度图像而言,则是将(g)使用(255 - g)替换。 如下图所示: RGB图像 RGB取反图像 灰度图像 灰度取反...
  • 图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息,访问和修改图像像素值,图像显示,图像类型转换等等。熟练掌握这些基本操作有助于使用VTK进行图像处理的快速开发。   5.4.1图像信息...
  • //操作像素实现反相 for (int row = 0; row ;row++) { for (int col = 0; col ; col++) { if (nc_example == 1) { gray = out_ex1.at(row, col); out_ex1.at(row, col) = 255 - gray; } ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,435
精华内容 2,174
关键字:

像素值取反