openvc中读取图像访问图像中像元的的方法

一、读取图像

1、利用Mat数据结构读取和显示图片

#include"cv.h"
#include "highgui.h"
#include<iostream>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
   Mat img=imread("./ImageData/sf1.png");//图片的相对路径
    namedWindow("new");
    imshow("new",image);
return 0;
}

2、利用IplImage指针读取并显示图片

IplImage* image=cvLoadImage("./ImageData/Im_49.png");
cvNamedWindow("image",1);
cvShowImage("image",image);

  

二、访问图像中像元的光谱值

按照图像类型可以将图像分为单通道图像(灰度图像)和多通道图像(RGB)

1、通过指针直接访问像元的灰度值

a、访问单通道图像

 1 //读取rgb彩色图像
 2 IplImage* imgTest=cvLoadImage("./ImageData/sf1.jpg");
 3
 4
 5 uchar  tcout;
 6
 7 //创建同样大小的三个单通道图像
 8 IplImage* rImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1);
 9 IplImage* gImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1);
10 IplImage* bImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1);
11
12 //将rgb彩色分解到三个单通图像中
13 cvSplit(imgTest,rImg,gImg,bImg,NULL);
14
15
16 //访问当通道图像rImg
17     for (int i=0;i<rImg->height;i++)
18     {
19         for (int j=0;j<rImg->width;j++)
20         {
21             tcout=((uchar *)(rImg->imageData+i*rImg->widthStep))[j];
22
23         }
24
25     }

这其中有一点需要注意访问时的两个for循环中rImg->heighrImg->width的顺序,很有可能写反了出现内存不可访问的问题 ,之前按照网上的程序写老是出现这个问题,修改过后才得以解决(不知道是Opencv版本的问题还是其他原因);问题提示的错误如下图:

b、访问多通道图像

//读取rgb彩色图像
IplImage* imgTest=cvLoadImage("./ImageData/sf1.jpg");

//创建三个单通道图像
IplImage* TImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1);
IplImage* TImg1=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1);
IplImage* TImg2=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1);

//
uchar* dat2=(uchar*)imgTest->imageData;//以指针的形式访问多通道数据
int step=imgTest->widthStep/sizeof(uchar);//图像中每一行的数据长度
int channels=imgTest->nChannels;//图像通道数

for (int i=0;i<temp->height;i++)
	{
		for (int j=0;j<temp->width;j++)
		{
			((uchar *)(TImg->imageData+i*TImg->widthStep))[j]=dat2[i*step+j*channels+0];
			((uchar *)(TImg1->imageData+i*TImg1->widthStep))[j]=dat2[i*step+j*channels+1];
			((uchar *)(TImg2->imageData+i*TImg2->widthStep))[j]=dat2[i*step+j*channels+2];

		}

	}

  

2、通过cvGet2D()和cvSet2D访问和修改相应像元值

IplImage* image=cvLoadImage("./ImageData/Im_49.png");

for (int i=0;i<image->height;i++)
	{
		for (int j=0;j<image->width;j++)
		{
			CvScalar s=cvGet2D(image,i,j); 

                        s.val[0]>0
			s.val[1]=255;
			s.val[2]=0;
			cvSet2D(image,i,j,s);

		}
	}

 

时间: 2024-10-30 10:45:54

openvc中读取图像访问图像中像元的的方法的相关文章

jmeter中通过beanshell访问eclipse中导出jar中的java类的方法

主要步骤 1.在eclipse中导出要引用的java代码为jar文件 2.将生成的jar文件放到jmeter的lib的ext目录下 3.在jmeter的jsr223处理器中导入要引用的java类型文件 01)导出jar文件 02)引用的第3放jar包 03)jmeter中使用beanshell,推荐使用JSR223处理器.

从服务器中读取图片至页面中

图片的数据数据库中存储: else if ("/cake/getImg.do".equals(req.getServletPath())) { String idStr = req.getParameter("id"); Cake cake = cakeService.getCakeImg(Long.valueOf(idStr)); //通过Mybatis获取图片的数据,封装在cake这个类中 try { resp.setContentType("mult

ubuntu14.04中利用samba访问linux/windows共享目录的方法

http://book.zhulang.com/312241/354052.html http://book.zhulang.com/312241/354053.html http://book.zhulang.com/312241/354054.html http://book.zhulang.com/312241/354055.html http://book.zhulang.com/312241/354056.html http://book.zhulang.com/312241/3540

opencv 访问图像像素的三种方式

访问图像中的像素 访问图像像素有三种可行的方法方法一:指针访问指针访问访问的速度最快,Mat类可以通过ptr函数得到图像任意一行的首地址,同时,Mat类的一些属性也可以用到公有属性 rows和cols 表示行和列通道数可以通过channels()函数获得:void visitPix1(){ Mat srcImg = imread("jpg/1.jpeg"); Mat dstImg; srcImg.copyTo(dstImg); int rowNum = dstImg.rows; int

java中读取特殊文件的类型

java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.indexOf(".")+1,s.length()); if(s1.indexOf(".")>0){ s1=getTypeName(s1); } else{ return s1; } return s1;} 第二种方法(利用java中自带的格式库): new Mimetyp

BarCode Reader SDK使用教程:如何从图像中读取条码

我们知道很多语言都可以在windows平台上读取条码,今天将分享在BarCode Reader SDK中如何用VB.NET或者C#来读取图像中的条码. [BarCode Reader SDK下载] 这段代码演示了如何从图像中读取条码及打印到输出控制台. Visual Basic .NET: Imports System.IO Imports Bytescout.BarCodeReader ' requiring to install evaluation or full version of B

访问图像中的像素[OpenCV 笔记16]

再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存储方式 灰度图像 RGB图像,矩阵的列会包含多个子列 因为内存足够大,可以实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行.连续存储,有助于提高图像扫面速度,可以使用isContinuous()来判断矩阵是否是连续存储. 颜色空间缩减 对于三通道图像,一个像素对应的颜色有一千六百

本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能

import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.color.ColorSpace; import java.awt.geom.AffineTransform;

中值滤波与图像锐化

本文主要包括以下内容 中值滤波及其改进算法 图像锐化, 包括梯度算子.拉普拉斯算子.高提升滤波和高斯-拉普拉斯变换 本章的典型囊例分析 对椒盐噪声的平滑效果比较 Laplacian与LoG算子的锐化效果比较 中值滤波 中值滤波本质上是一种统计排序滤波器. 对于原图像中某点(i,j), 中值滤波以该点为中 心的邻域内的所有像素的统计排序中值作为(i, j) 点的响应. 中值不同于均值, 是指排序队列中位于中间位置的元素的值,例如=采用3x3 中值滤披 器, 某点.(i,j) 的8 个邻域的一系列像