精华内容
下载资源
问答
  • 分别可以根据图像。对一图,二图,四图,八位图,十六位图,二十四图,三十二位图文件显示,并显示像素点的rgb值和坐标值
  • 建立以图像中心为原点的坐标系,求出x>0的所有像素点的坐标。虽然没有悬赏,但可以私聊
  • 使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

    万次阅读 多人点赞 2018-03-27 17:16:47
    一. 所需结构体CvScalar结构体介绍typedef struct ... 所需函数cvGet2D函数功能:获取像素点上的RGB颜色分量,如果是灰度图直接返回灰度图颜色分量函数原型:CvScalar cvGet2D( const CvArr* arr, int idx0, int idx...

    一.  所需结构体

    CvScalar

    结构体介绍

    typedef struct CvScalar  
    {  
      double val[4];  //BGRA
      }CvScalar;  
    二. 所需函数
    cvGet2D

    函数功能:获取像素点上的RGB颜色分量,如果是灰度图直接返回灰度图颜色分量

    函数原型:

    CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );

    参数介绍:

     

    const CvArr* arr:    要获取像素点颜色分量的图像指针
    int idx0:            对应第几行
    int idx1:            对应第几列

    返回值:将获取到的像素点值以BGR的顺序返回到CvScalar结构体的val元素中,如果是灰度图那么val第一个元素就是灰度图的颜色分量

     

     

     

    三. 开始编写代码

    实验图:

    jpg格式

    3.1 打开一张图片

    //加载图像到内存
    IplImage *image = cvLoadImage("D:\\1.jpg");
    if (image == NULL){	//open image error
    	printf("打开图像文件失败!");
    	return -1;
    }

    获取像素点颜色RGB颜色分量

    CvScalar scalar;	//scalar
    	for (int i = 0; i <= image->height-1; ++i){
    		for (int j = 0; j <= image->width-1; ++j){
    			scalar = cvGet2D(image,i,j);	//获取像素点的RGB颜色分量
    			printf("第%d个像素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);
    			getchar();	//防止打印速度太快,暂停一次打印一次
    		}
    	}

    运行结果:

    完整代码:

    	//加载图像到内存
    	IplImage *image = cvLoadImage("D:\\1.jpg");
    	if (image == NULL){	//open image error
    		printf("打开图像文件失败!");
    		return -1;
    	}
    	CvScalar scalar;	//scalar
    	for (int i = 0; i <= image->height-1; ++i){
    		for (int j = 0; j <= image->width-1; ++j){
    			scalar = cvGet2D(image,i,j);	//获取像素点的RGB颜色分量
    			printf("第%d个像素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);
    			getchar();	//防止打印速度太快,暂停一次打印一次
    		}
    	}

    HSV通道:

     

    需要cvCvtColor函数,我们只需要复用一下上面的代码即可

     

    注意HSV颜色空间没有顺序问题,而RGB颜色空间Opencv使用的是BGR!

    //加载图像到内存
    	IplImage *image = cvLoadImage("D:\\1.jpg");
    	if (image == NULL){	//open image error
    		printf("打开图像文件失败!");
    		return -1;
    	}
    	IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意图像必须和输入图像的size,颜色位深度,通道一致
    	cvZero(image1); //清空image_data数据  
    	cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV  
    	CvScalar scalar;	//scalar
    	for (int i = 0; i <= image1->height-1; ++i){	//HSV
    		for (int j = 0; j <= image1->width-1; ++j){
    			scalar = cvGet2D(image1, i, j);	//获取像素点的RGB颜色分量
    			printf("第%d个像素的H:%d°,S:%lf,V:%lf\n", (i*image->width) + j, (int)scalar.val[0]*2, scalar.val[1]/255, scalar.val[2]/255);
    			getchar();	//防止打印速度太快,暂停一次打印一次
    		}
    	}

    运行结果:

    展开全文
  • opencv中遍历每一个像素点进行处理

    千次阅读 2017-07-04 12:36:56
    有时候我们需要遍历Mat中的每一个像素点,并且对像素点进行处理,这里以图像所有像素点都减去div(div属于int类型) void colorReduce(Mat& inputImage, Mat& outputImage, int div) { // 参数准备 outputImage = ...

    1.用动态地址操作像素:

    	Mat srcImage(100, 100, CV_8UC3, Scalar(200,20,100));
    
    	imshow("显示图像", srcImage);
    
    
    	int rowNumber = srcImage.rows;
    	int colNumber = srcImage.cols;
    
    
    	for (int i = 0; i < rowNumber; i++)
    	{
    		for (int j = 0; j < colNumber; j++)
    		{
    
    			if (srcImage.at<Vec3b>(i, j)[0] > 180) 
    			{
    				srcImage.at<Vec3b>(i, j)[0] = 0;			
    			}
    			
    			if (srcImage.at<Vec3b>(i, j)[1] < 50) 
    			{
    				srcImage.at<Vec3b>(i, j)[1] = 255;
    			}
    
    			if (srcImage.at<Vec3b>(i, j)[2] < 120) 
    			{
    				srcImage.at<Vec3b>(i, j)[2] = 0;
    			}
    
    		}
    	}
    
    
    	imshow("处理后的图像", srcImage);
    cv::mat的成员函数: .at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。(Mat类中的cols和rows给出了图像的宽和高。而成员函数at(int x, int y)可以用来存取图像的元素。)由于at方法本身不会对任何数据类型进行转化,故一定要确保指定的数据类型和矩阵中的数据类型相符合。

    假设提前已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),对像素的赋值操作为image.at<uchar>(i,j) = value。而对于彩色图像,每个像素由三个部分构成:蓝色通道、绿色通道和红色通道(BGR),对于一个包含彩色图像的Mat,会返回一个由三个8位数组组成的量。OpenCV将此类型定义为Vec3b,即由三个unsigned char组成的向量。这也解释了为什么存取彩色图像像素的代码可以写成:image.at<Vec3b>(i,j)[channel] = value;


    以下是统计canndy后的0像素点与255像素点之间的数量的比值:

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main() 
    {
    	Mat graySrc = imread("../../11.bmp", 0);
    
    	Mat canImage;
    	Canny(graySrc, canImage, 60, 120);
    
    	int PicZero = 0;
    	int PicFull = 0;
    
    	for (int i = 0; i < graySrc.rows; ++i) 
    	{
    		for (int j = 0; j < graySrc.cols; ++j) 
    		{
    			if (canImage.at<unsigned char>(i, j) == 0) 
    			{
    				PicZero++;
    			}
    			else
    			{
    				PicFull++;
    			}	
    		}
    	
    	}
    
    	cout << "0像素点比255像素点的比值为" << (double)PicZero / PicFull << endl;
    
    	system("pause");
    }





    2.用指针的方法:

    有时候我们需要遍历Mat中的每一个像素点,并且对像素点进行处理,这里以图像所有像素点都减去div(div属于int类型)

    void colorReduce(Mat& inputImage, Mat& outputImage, int div)
    {
    	// 参数准备
    	outputImage = inputImage.clone();
    
    	int rowNumber = outputImage.rows;
    	int colNumber = outputImage.cols*outputImage.channels();
    
    	for (int i = 0; i < rowNumber; i++)
    	{
    		// 获取第i行的首地址
    		uchar* data = outputImage.ptr<uchar>(i);
    
    		for (int j = 0; j < colNumber; j++)  // 列循环
    		{
    			// 开始处理每一个像素值,每一个像素值都减去div
    			data[j] = data[j] - div;
    		}
    	}
    }

    也可以写成如下形式:

    Mat inverseColor1(Mat srcImage) 
    {
    	Mat tempImage = srcImage.clone();
    	int row = tempImage.rows;
    	int col = tempImage.cols * tempImage.channels();
    
    	for (int i = 0; i < row; ++i) 
    	{
    
    		const unsigned char* sourcedata = srcImage.ptr(i);
    
    		unsigned char* data = tempImage.ptr(i);
    
    		for (int j = 0; j < col; j++)
    		{
    			data[j] = sourcedata[j] - div;
    		}
    	}
    	return tempImage;
    }
    此时是定义了两个指针类型: const unsigned char*和 unsigned char*,其中const unsigned char* 中的内容只能够被读取,不能被修改

    特别需要注意的是:Mat中每一行元素的个数=列数*通道数


    如需要打印M,

    	Mat M(3, 2, CV_8UC3, Scalar(0, 0, 255));
    	cout << M << endl;
    打印结果为:验证了每一行元素的个数为: 列数*通道数

    另外需要注意的是:Mat 除了拥有成员变量cols,rows,成员函数channels()之外,还提供了ptr函数可以返回得到图像任意行的首地址。





    3.用迭代器Matlterator_:

            Matlterator_是Mat数据操作的迭代器,:begin()表示指向Mat数据的起始迭代器,:end()表示指向Mat数据的终止迭代器。迭代器方法是一种更安全的用来遍历图像的方式,首先获取到数据图像的矩阵起始,再通过递增迭代实现移动数据指针。

    Mat inverseColor4(Mat srcImage) 
    {
    	Mat tempImage = srcImage.clone();
    
    	// 初始化原图像迭代器
    	MatConstIterator_<Vec3b> srcIterStart = srcImage.begin<Vec3b>();
    	MatConstIterator_<Vec3b> srcIterEnd = srcImage.end<Vec3b>();
    
    	// 初始化输出图像迭代器
    	MatIterator_<Vec3b> resIterStart = tempImage.begin<Vec3b>();
    	MatIterator_<Vec3b> resIterEnd = tempImage.end<Vec3b>();
    
    	while (srcIterStart != srcIterEnd) 
    	{
    		(*resIterStart)[0] = 255 - (*srcIterStart)[0];
    		(*resIterStart)[1] = 255 - (*srcIterStart)[1];
    		(*resIterStart)[2] = 255 - (*srcIterStart)[2];
    
    		srcIterStart++;
    		resIterStart++;
    	}
    
    	return tempImage;
    
    }



    展开全文
  • CImage 访问像素点 像素数据操作

    千次阅读 2012-10-08 16:37:19
    在CImage类的像素访问 MSDN的代码 COLORREF pixel; int maxY = imgOriginal.GetHeight(), maxX = imgOriginal.GetWidth(); byte r,g,b,avg; for (int y=0; y; y++) { for (int x=0; x; x++) {

    在CImage类的像素访问

    MSDN的代码

    COLORREF pixel;
       int maxY = imgOriginal.GetHeight(), maxX = imgOriginal.GetWidth();
       byte r,g,b,avg;
       for (int y=0; y<maxY; y++) {
        for (int x=0; x<maxX; x++) {
         pixel = imgOriginal.GetPixel(x,y);
         r = GetRValue(pixel);
         g = GetGValue(pixel);
         b = GetBValue(pixel);
         avg = (r+ g+ b)/3;
         imgOriginal.SetPixelRGB(x,y,avg,avg,avg);
    }}

    这种方式效率很低, 因为每次调用getpixel,都包含着程序的进栈和出栈。所以,面对大量需要处理的数据,采用直接访问内存地址的方法。

    byte* pRealData;
       pRealData=(byte*)imgOriginal.GetBits();
       int pit=imgOriginal.GetPitch();
       int bitCount=imgOriginal.GetBPP()/8;
       for (int y=0; y<maxY; y++) {
        for (int x=0; x<maxX; x++) {
    int grayVal=(int)(int)(*(pRealData + pit*y + x*bitCount))*0.3
          +
          (int)(int)(*(pRealData + pit*y + x*bitCount +1))*0.59
          +
          (int)(int)(*(pRealData + pit*y + x*bitCount +2))*0.11;
         *(pRealData + pit*y + x*bitCount)=grayVal;
         *(pRealData + pit*y + x*bitCount +1)=grayVal;
         *(pRealData + pit*y + x*bitCount +2)=grayVal;
    //如果是8位灰度图像,直接读取一个BYTE位为灰度值
    //如果是24位RGB图像,则依次读取pixAddr,pixAddr+1,pixAddr+2为B、G、R分量值
    }}

    用两种方法对同一张图片(3264*2448像素)进行处理,前者需要1分钟,后者只需1秒左右。

    所以,后者比前者至少快60倍。

    还有一种处理方式

    //真彩色图像变为灰度图,直接修改像素点的值

    void PixelsChangedToGray(CImage *pImage)
    {
     	int		nByte,j,i,nWidth,nHeight,nBytesPerPixel;
    	BYTE	*pPixelLine,cNewPixelValue;
    	nWidth=pImage->GetWidth();	nHeight=pImage->GetHeight();
    	nBytesPerPixel= pImage->GetBPP()/8;
    	for (i=0;i<nHeight;i++){
    	    pPixelLine =(BYTE*) pImage->GetPixelAddress(0,i);
    	    nByte=0;
    	    for (j=0;j<nWidth;j++){ 		cNewPixelValue=(BYTE)(0.11*pPixelLine[nByte]
                                                            +0.59*pPixelLine[nByte+1]
                                                            +0.30*pPixelLine[nByte+2]);
    		pPixelLine[nByte] = pPixelLine[nByte+1] = pPixelLine[nByte+2]
                            = cNewPixelValue;
    		nByte+=nBytesPerPixel;
    	    }  
    	}
    }

    //非真彩色图像变为灰度图,修改调色板信息

    void PaletteChangedToGray(CImage *pImage)
    {
     	RGBQUAD	ColorTabs[256];
     	int		i,nColorTableEntries,nNewGrayColor;
    	nColorTableEntries=pImage->GetMaxColorTableEntries();
     	pImage->GetColorTable(0,nColorTableEntries,ColorTabs);
    	for (i=0;i<nColorTableEntries;i++){
    	    nNewGrayColor=(int)(0.11*ColorTabs[i].rgbBlue
                                               + 0.59*ColorTabs[i].rgbGreen 
                                               + 0.30*ColorTabs[i].rgbRed);
    	    ColorTabs[i].rgbBlue = (BYTE)nNewGrayColor;
    	    ColorTabs[i].rgbGreen = (BYTE)nNewGrayColor;
    	    ColorTabs[i].rgbRed = (BYTE)nNewGrayColor;    
    	}
    	pImage->SetColorTable(0,nColorTableEntries,ColorTabs);
    }


    展开全文
  • 一个像素点为4个字节

    千次阅读 2018-11-05 17:56:20
    【webkit的源码】https://github.com/WebKit/webkit/blob/master/Source/WebCore/html/HTMLCanvasElement.cpp#L365 ...这意味着 一个逻辑像素需要9个物理像素去补充。那就意味着 dpr=3的一个1px(逻辑)像素需要 9...

    【webkit的源码】https://github.com/WebKit/webkit/blob/master/Source/WebCore/html/HTMLCanvasElement.cpp#L365
    在这里插入图片描述
    在这里插入图片描述

    在移动端是否耗内存比较大,手机分辨率高dpr 比较大,比如iPhone6P以上都是 3倍。这意味着 一个逻辑像素需要9个物理像素去补充。那就意味着 dpr=3的一个1px(逻辑)像素需要 9个物理像素。一个物理像素需要4byte那就意味着 dpr=3的手机 1px逻辑像素 需要内容 36byte内存

    21寸显示器 19201080 1寸含有104104个像素点
    在这里插入图片描述

    展开全文
  • 图像的通道和深度以及图像的像素点操作完全解析

    万次阅读 多人点赞 2017-03-23 14:51:13
    前沿 看了图像处理有一段时间了,但是图像的通道和深度一直不理解,毕竟是比较抽象的...二值图像:图像的像素点不是0 就是1 (图像不是黑色就是白色),图像像素点占的位数就是 1 ,图像的深度就是1,也称作位图。
  • 遍历图像像素点rgb java attilax总结   1. 遍历像素点 1 2. 提取一行 1 3. Rgb分量提取 2 4. 其他读取像素 3 5. --code 5 6. 参考 6   1. 遍历像素点 ImgxPicPhotoSplitor.java atibrow prj ...
  • iPhone像素点和常用控件尺寸

    千次阅读 2014-01-15 13:31:51
    1、 iPhone中的像素。 ...(pt)的英文全称是point,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位...像素(pixel)由Picture和 Element这两个词组成,像素
  • 获取模型的材质球贴图中的像素点色值,可以计算模型贴图的RGB、或某个色值的占比,也可以动态修改指定像素色值。 方式一: 获取可读的贴图,并遍历像素点:(通过Texture获取Texture2D操作的运算量比较大,耗时长...
  • OpenCV访问像素点的灰度值

    万次阅读 2018-08-02 10:49:18
    1.Mat矩阵数值的存储方式 ... 这里以指针的方式访问图像素为例  (1)单通道    定义一个单通道图像:   cv::Mat img_1 = (320, 640, CV_8UC1, Scalar(0));  对于单通道M(i,j)即为第i行j列的其...
  • 读取BMP图像每一像素点RGB数据

    万次阅读 2012-12-13 14:16:28
    对于24bmp图片,每一个像素点存放着此点的RGB值。首先定义一个结构体,包含红(red)、绿(green)、蓝(blue)这三个字段,如下: //像素颜色值 typedef struct tagPOINT{ BYTE b; BYTE g; BYTE r; } POINT...
  • RoboMaster视觉教程(5)目标位置解算(通过像素点获取转角)概览直接使用像素坐标的缺陷摄像头标定根据小孔成像原理得到需要的转角角度测量验证 概览 在识别到目标后,有一个很重要的问题:我们的最终目的是瞄准、...
  • RGB彩色图像中,一种彩色由R(红色),G(绿色),B(蓝色)三原色按比例混合而成。 图像的基本单元是一个像素,就像一个巨幅电子广告屏上远处看是衣服图像,走近...一张9像素的8RGB图像,在计算机内存中的分布大...
  • 图像像素点上的值表示的什么

    千次阅读 2019-01-07 16:02:24
    数字图像,又称数码图像或数图像,是二维图像用有限数字数值像素的表示。由数组或矩阵表示,其光照位置和强度都是离散的。数字图像是由模拟图像数字化得到的、以像素为基本元素的、可以用数字计算机或数字电路存储...
  • Matlab 图像像素点在RGB空间的显示

    千次阅读 2016-03-16 06:54:06
    在写论文的时候,经常需要将三通道的像素点显示在RGB空间,这段代码基本实现了该功能,但是还有些不完善,鉴于才学Matlab,目前只能做到这一步。代码如下: I=imread('C:\Users\徐图之\Desktop\mywaysb0.7.jpg'); ...
  • 五.使用OpenCv操作图像上每一个像素点

    千次阅读 多人点赞 2014-04-05 18:47:16
    本文记录使用OpenCv操作图像上每一个像素点,用摄像头采集(拍照)或者直接加载一副图像后,树莓派系统会在内存中为这幅图像分配内存空间,通过定义的IplImage结构体指针指向这块内存空间就方便可以操控它。...
  • 数据处理--图片像素点聚类

    千次阅读 2018-08-22 19:00:24
    原理: 将原图数据的像素点替换为分为聚类后的像素点,这些像素点其实就是将原数据的像素点分为16种后的像素点 result_img = centers[y_] 6)将聚类后的图片绘出来比较 注意:要将图片的数据进行形状...
  • %%%%%%%%%%%%%%%白色像素点数量%%%%%%%%%%%%%%% %%%%%%%%%%%%%%matlab读取jpg图片中规定区域中的每个图片白色像素点数量%%%%%%%%%%%%% clc; clear all; %%## 这张照片是24的 I = imread(‘G:\7.matlab2016\1.牛奶...
  • 主要通过获取本地的一张图片,分析图片每一像素点的RGB值,由此获得每一像素点的灰度值,并对这些灰度值进行熵的计算。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.*; ...
  • 从前面的文字中就可以看出,对数字图像的处理都是在像素级上操作的,准确地讲是操作像素点的RGB值,在图像取反和灰度图像转换两篇中已经涉及到了对RGB操作的相关代码,相信大家已经也看到了,就是这一段:for (int j...
  • 位图和像素位

    千次阅读 2015-05-04 11:11:27
    来源于MSDN 代码下载位置: Foundations2008_06.exe (159 KB)  在线浏览代码 ...像素数组  ...位图像素格式  PixelFormats 勘误表  预乘 Alpha  WriteableBit
  • 什么是像素位深度

    万次阅读 2011-08-30 16:05:12
    像素位深度是指每个像素所用的位数(bit),像素位深度决定了彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。例如,一幅彩色图像的每个像素用R、G、B三个分量来表示,若每个分量用8...
  • 【OpenCV】 Java获取像素点的RGB值

    千次阅读 2019-03-13 20:08:12
    其实也就是将图片的RGB信息放进pixel里面,获取像素点的RGB值 PS :1. &0xff 为了保证二进制数据的一致性(在上一篇博文已经提过  点此查看 )  2. ((255&0xff) ) | ((r&0xff) ) | ((g&0xff) ) | (r&0xff)...
  • 取决于像素类型,类型决定了这个像素点包含的信息量 以及是否采用了压缩技术 如果是非黑即白的二值图像,不压缩情况下,一个像素只需要1个bit,显然,1和0两种状态,分别对应黑和白。 如果是256种状态的灰度...
  • //读出图片的像素数据 cout ; IMAGEDATA **imagedata;//存储像素信息 imagedata = (IMAGEDATA **)malloc(sizeof(IMAGEDATA*)*strInfo.biHeight); for (i = 0; i ; i++) *(imagedata + i) = (IMAGEDATA...
  • 以前在做图像处理的时候,一直不太在意这个问题,对图像每个像素点的灰度值,总是认为char也可,unsigned char也可。尽管它们都是8,但是表示的数的范围却不相同:char: -128~127, unsigned char: 0~255。很明显,...
  • OpenCV 4.1.0 中图像像素运行:与、或、非、异或(C++代码演示)。 编程环境:OpenCV 4.1.0 + Visual Studio 2017

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,653
精华内容 37,861
关键字:

像素点位