
Opencv读取文件夹连续,RGB分量显示,图像灰度化
1读取文件夹连续
刚开始学习图像处理,开始只能一次读入一张,今天从网上查了一些资料,自己写了一个可以连续读取多张函数。
char filename[100];
char windowname[100];
IplImage pScr;
unsigned char Readfigsmethod1(int num)// 读入num个
{
for(int i=1;i<=num;i++)
{
sprintf(filename,"D:/test/%djpg",i);// 将以数字命名:例如1jpg 2jpg等,放入D:/test/文件夹下
sprintf(windowname,"window%djpg",i);
pScr=cvLoadImage(filename,1);//导入
cvNamedWindow(windowname,CV_WINDOW_AUTOSIZE);
cvShowImage(windowname,pScr);//显示
//cvWaitKey(0);
}
cvWaitKey(0);
cvReleaseImage(&pScr);//释放
cvDestroyAllWindows();//销毁窗口
return 0;
}
注释:连续读取主要问题在于filename指向目录, sprintf(filename,"D:/test/%djpg",i)的使用可以使得filename可以从1jpg,2jpg,一直到numjpg filename=D:/test/ijpg
2RGB分量显示,图像灰度化
// RGBSPLITcpp : Defines the entry point for the console application
//
#include "stdafxh"
//#include "afxh"
#include "cvh"
#include "highguih"
#include <stdioh>
#include <stringh>
#include <stdlibh>
char filename[100];
char filename1[100];
char windowname[100];
IplImage pScr;
IplImage img1;
IplImage img=0;
IplImage img_red=0;
IplImage img_green=0;
IplImage img_blue=0;
unsigned char Readfigsmethod1(int num);//实现连续读取的函数
unsigned char RGBsplit(IplImage img);//实现RGB量分开显示的函数
unsigned char RGBtoGray(IplImage img);//实现灰度化函数
int main(int argc, char argv[])
{
img=cvLoadImage("D:\\test\\1jpg");
cvNamedWindow("lena",CV_WINDOW_AUTOSIZE);//创建窗口,窗口名字lena
cvShowImage("lena",img);//载入转化后的图像
RGBsplit(img);//调用RGB分开显示函数,若想实现其他功能,在此处调用其他函数即可。但是显示后cvReleaseImage()中相应参数要更改成显示的对象。
cvWaitKey(0);
cvReleaseImage(&img);
cvReleaseImage(&img_red);
cvDestroyAllWindows();
return 0;
}
unsigned char Readfigsmethod1(int num)
{
for(int i=1;i<=num;i++)
{
sprintf(filename,"D:/test/%djpg",i);
sprintf(windowname,"window%djpg",i);
pScr=cvLoadImage(filename,1);
cvNamedWindow(windowname,CV_WINDOW_AUTOSIZE);
cvShowImage(windowname,pScr);
//cvWaitKey(0);
}
cvWaitKey(0);
cvReleaseImage(&pScr);
cvDestroyAllWindows();
return 0;
}
unsigned char RGBtoGray(IplImage img)
{
img1 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//色彩空间转换,将源彩色图像img转化成目标灰色图像imag1
cvCvtColor(img,img1,CV_BGR2GRAY); //关键
cvNamedWindow("GrayImage",CV_WINDOW_AUTOSIZE);//创建窗口,窗口名字GrayImage
cvShowImage("GrayImage",img1);//载入转化后的图像
return 0;
}
unsigned char RGBsplit(IplImage img)
{
//IplImage imgeR,img_blue,imageG,imgGRAY;
int width=img->width;
int height=img->height;
int channel=img->nChannels;
int widthStep=img->widthStep;
int i,j;
img_red= cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
img_green= cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
img_blue= cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
for (i=0;i<height;i++)
{
for (j=0;j<width;j++)
{
CvScalar t=cvGet2D(img,i,j);
double s0=tval[0];
double s1=tval[1];
double s2=tval[2];
CvScalar m_blue=cvScalar(s0,0,0,0);
CvScalar m_green=cvScalar(0,s1,0,0);
CvScalar m_red=cvScalar(0,0,s2,0);
cvSet2D(img_blue,i,j,m_blue);
cvSet2D(img_green,i,j,m_green);
cvSet2D(img_red,i,j,m_red);
}
}
cvNamedWindow("imgred",1);
cvShowImage("imgred",img_red);
return 0;
}
采用两个二值图像作为水印嵌入数据,对视频水印进行预处理31 3水印嵌入和检测方案,本文采用二维阿诺德变换。二维阿诺德变换定义为:,(x,y)是原始图像的像素,(x,y)是一个新的像素图像变换,n图像是图像的大小的顺序,并且更一般为正方形图像。由于阿诺德变换的周期性,我们可以使用周期周期变换图像。即在水印嵌入过程中,水印置乱的次数可以作为关键时刻,然后嵌入水印。当水印被提取,水印可以继续(周期倍)。这是利用阿诺德变换进行修复方案。阿诺德转换的数量由版权所有者保存。
乱具有以下优点:水印是
(1)通过置乱的合法可以自由控制算法选择、参数选择和随机数技术,使非法用户很难理解图像的内容,可以提高水印信息的安全性;
(2)分配扰码技术可以分散点误差,提高水印的视觉效果,从而提高其鲁棒性。在3 32视频水印中嵌入水印算法的关键在于以下三点:(1)水印结构;(2)水印嵌入区域;(三)嵌入技术;选取两个二值图像作为水印。为了提高水印的鲁棒性,大多数DCT域水印算法将水印嵌入到DCT系数的低频部分。但低频区域是图像的能量集中,嵌入到低频会降低透明度。虽然嵌入在高频段虽然透明度好,但对于大多数图像处理的高频分量有很大的影响,从而降低水印的鲁棒性。因此,水印算法的水印信号大部分嵌入在中频DCT系数的载体图像,以达到最佳的透明度和鲁棒性之间的权衡。各种嵌入技术的最终目的是提高水印的鲁棒性和透明性。为了提高水印的鲁棒性以及满足人类视觉的限制,必须基于HVS的嵌入位置。本文将HVS分为运动灵敏度、纹理灵敏度和亮度敏感度。在下面的嵌入过程中,这些功能得到充分利用。图3-1显示中间分支。嵌入过程如图3-1所示。图3-1水印嵌入过程读取视频中的亮度分量Y,因为它是最有效的数据,根据NEC算法,嵌入其中的水印具有最强的鲁棒性。根据公式(3-2),给出了运动灵敏度阈值的计算公式,发现32帧对Yi(I = 1,2)更敏感,…32)。
(3-2)
(T代表当前帧的数量)
接下来的Y32数据按照64×64的尺寸裁成20 byij(j = 1,2),…20),我们可以得到20块的三维数据块BYk(k = 1,2,64×64×32),…20,如图2-3所示。图3-2
亮度块根据
式(3-3),(3-4)显示的亮度敏感性LK和DK的公式,通过计算纹理的敏感性,我们选择来计算一块20块数据的值都比较高的()作为水印嵌入块。
(3-3)
(3-4),这是在BYk的亮度数据,。最后,考虑到该算法的复杂性和性能,我们对所选择的块实现了2阶DCT变换。根据NEC算法的思想,为了抵抗滤波和压缩攻击,我们将争先恐后地将水印序列嵌入到第一帧DCT系数C(u,v)中,见公式(3-5)。在4的数据中,c(u,v)是DCT变换系数的第一帧,C(u,v)是水印嵌入系数,S是非负整数(并满足T1 = S \\ \\,T2 = 3 T1)。在完成嵌入后,用C(u,v)实现抗2维DCT变换,将水印嵌入到视频数据中,再将它们放回原来的位置。重要的是要注意,在嵌入过程中使用的所有参数都应保留为密钥。具体程序如下:第一步:总共有32帧视频Y组件数据:<(1)读t
1、数字图像:
数字图像,又称为数码图像或数位图像,是二维图像用有限数字数值像素的表示。数字图像是由模拟图像数字化得到的、以像素为基本元素的、可以用数字计算机或数字电路存储和处理的图像。
2、数字图像处理包括内容:
图像数字化;图像变换;图像增强;图像恢复;图像压缩编码;图像分割;图像分析与描述;图像的识别分类。
3、数字图像处理系统包括部分:
输入(采集);存储;输出(显示);通信;图像处理与分析。
4、从“模拟图像”到“数字图像”要经过的步骤有:
图像信息的获取;图像信息的存储;图像信息处理;图像信息的传输;图像信息的输出和显示。
5、数字图像1600x1200什么意思?灰度一般取值范围0~255,其含义是什么?
数字图像1600x1200表示空间分辨率为1600x1200像素;灰度范围0~255指示图像的256阶灰阶,就是通过不同程度的灰色来来表示图像的明暗关系,8bit的灰度分辨率。
我没用过Python的Opencv的库,只是用过Python的Image的库;Image库已经可以结果这个问题了
我试着做一下:你先得安装PIL库
得到rgb三个通道,然后转到HSV通道,其中H表示0-255的颜色,V表示强度,你大概先知道紫色的范围是多少
from PIL import Imageimport colorsys
def CalculateH(img):
if len(imggetbands()) == 4:
ir,ig,ib,ia = imgsplit()
else:
ir, ig, ib = imgsplit()
Hdat = []
Sdat = []
Vdat = []
for rd,gn,bl in zip(irgetdata(),iggetdata(),ibgetdata()):
h,l,s = colorsysrgb_to_hsv(rd/255,gn/255,bl/255)
Hdatappend(h)
Sdatappend(l)
Vdatappend(s)
meanV = mean(Vdat)
return Hdat, meanV
def myreadim(filename):
im = Imageopen(filename)
H,V = CalculateH(im)
后面我就懒得写了,应该思路都清楚了吧,要转到其他的颜色通道上,不要在rgb通道上
我简要地写一下吧~核心部分如下:
IplImage image;
int i, j;
double blue, green, red;
for(i=0; i<image->height; i++)
{
for(j=0; j<image->width; j++)
{
blue=((uchar)(image->imageData + iimage->widthStep))[j3];
green=((uchar)(image->imageData + iimage->widthStep))[j3+1];
red=((uchar)(image->imageData + iimage->widthStep))[j3+2];
}
}
上面for循环获取到的就是彩色图像RGB三个通道的值,至于灰度图比这个简单,我不说你也应该可以自己写出来的。记住不会的地方要多查OpenCV手册,那是最好的老师!
在前面,我们只介绍了三种图像的类型,分别位二值图像、灰度图像以及RGB图像。但我们现在常用的图像肯定是RGB图像,不过它只是色彩空间的一种类型,在实际的图像中,还有许多其他的色彩空间,对于会PS的读者来说肯定不会陌生。
比如GRAY色彩空间(灰度图像),XYZ色彩空间,YCrCb色彩空间,HSV色彩空间,HLS色彩空间,CIEL a b 色彩空间,CIEL u v 色彩空间,Bayer色彩空间等。
每个图像都有其擅长处理的内容,因此我们要掌握这些色彩空间图像的转换,以便后续更方便的处理图像的问题。
GRAY就是我们前面介绍的灰度图像,通常指8位灰度图像,其具有256个灰度级,像素值范围位[0,255]。
RGB转换位GRAY的数学公式如下:
Gray=0229 R+0587 G+0114B
而图像有GRAY色彩空间转换为RGB色彩空间时,最终所有通道的值都是相同的,其处理方式如下:
R=Gray
G=Gray
B=Gray
XYZ色彩空间是由CIE(International Commission on Illumination)定义的,是一种更便于计算的色彩空间,它不像RGB转换位GRAY,只能单向转换,XYZ色彩空间与RGB转换不会丢失任何值。
将RGB色彩空间转换为XYZ色彩空间,其转换公式为:
将XYZ色彩空间转换为RGB色彩空间,其转换公式为:
人眼视觉系统对颜色的敏感度要低于对亮度的敏感度。在传统的RGB色彩空间内,RGB三原色具有相同的重要性,但是忽略了亮度的信息。所以,才有了YCrCb色彩空间。
在YCrCb色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。
亮度给出了颜色亮或暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。在RGB光源中,绿色分量的影响最大,蓝色分量的影响最小。
从RGB色彩空间转换YCrCb色彩空间的数学公式如下:
Y=0229 R+0587 G+0114B
Cr=(R-Y)0713+delta
Cb=(B-Y)0564+delta
其中delta的值为:
从YCrCb色彩空间转RGB数学公式如下:
R=Y+1403(Cr-delta)
G=Y-0714 (Cr-delta)-0344 (Cb-delta)
B=Y+1773(Cb-delta)
RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异。而HSV色彩空间是一种面向视觉感知的颜色模型。HSV色彩空间是从心理学和视觉的角度出发,指出人眼色彩知觉主要包含3个要素:色调,饱和度,亮度。
说到这里,相信用过PS的都应该清楚HSV到底能干什么了吧?不过,我们还是介绍一些这3个要素,毕竟本篇博文就是专门将色彩空间理论知识的,不能有空缺。
色调(H):指光的颜色,色调与混合光谱中的主要光波长相关,例如“赤橙黄绿青蓝紫”分别表示不同的色调。如果从波长的角度考虑,不同的波长的光表现为不同的颜色,实际上它们体现的是色调的差异。
饱和度(S):指色彩的深浅层度,相对于纯净度,或一种颜色混合白光的数量。纯谱色是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的,饱和度与所加白光的数量成反比。
亮度(V):反映的是人眼感受到的光的明暗程度,该指标与物体的反射度有关。对于色彩来讲,如果在其中掺入的白色越多,则其亮度越高;如果在其掺入的黑色越多,则亮度越低。
在具体的实现上,我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。因此,通过调整色调值,我们就能选取不同的颜色,色调的取值范围为[0,360]。色调取值不同,颜色也不同,具体如下表所示:
饱和度的值为[0,1],饱和度的值为0时,只有灰度,饱和度越大,颜色值越丰富。至于亮度,其取值范围也是[0,1]。
例如,博主现在取色调=0,饱和度=1,亮度=1,就可以提取色彩深红色。
介绍完理论知识,HSV与上面的色彩空间一样,也需要与RGB进行转换,不过,我们这里转换之前,需要先将RGB色彩空间的值转换到[0,1]之间,然后在进行处理。具体处理如下:
V=max(R,G,B) 亮度
这里,H的计算结果可能小于0,如果出现这种情况,则需要对H进一步的处理计算。如下所示:
上述公式计算的结果肯定与前面说的色调,亮度,饱和度的范围一致。至于HSV转RGB,感兴趣的可以参考开发文档。
HLS与HSV色彩空间类似,都具有3要素。只是HLS色彩空间就L与V不同,其中HLS色彩空间的L(光亮度/明度)替换了亮度。
那么什么是光亮度/明度呢?
其实,光亮度/明度是用来控制色彩的明暗变换,它的取值范围同样也是[0,1]。我们在程序中,可以通过光亮度/明度的大小来衡量有多少光线从物体表面反射出来。光亮度/明度对于眼睛感知颜色很重要,因为当一个具有色彩的物体处于光线太强或者太暗的地方时,眼睛是无法准确获取物体颜色的。
说实话,编辑公式有点费劲,感兴趣的自己查询开发文档,后续在python中开发,我们都是使用cv2cvtColor()进行转换的。使用起来,你只需要了解其到底做什么的,并不需要知道其内部如何实现,但内部实现,就是上面的这些数学公式。
CIEL a b色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中如果人所观察的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。
CIEL a b 色彩空间中的L分量用于表示像素的亮度,取值范围为[0,100],表示从纯黑到纯白;a 分量表示从红色到绿色的范围,取值范围为[-127,127];b分量表示从**到蓝色的范围,取值范围为[-127127]。
由于CIEL a b 是在CIE的XYZ色彩空间上发展起来的,所以转换的时候,需要先将RGB转换为XYZ色彩空间,然后在转换为CIEL a b 。具体的数学公式感兴趣的查询开发文档。
CIEL u v 色彩空间同CIEL a b 色彩空间一样,是均匀的颜色模型。CIEL u v色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。
同样的,CIEL u v 色彩空间也需要先将RGB转换为XYZ色彩空间,然后在转换为CIEL u v ,具体公式感兴趣的可以查询开发文档。
Bayer色彩空间被广泛的应用在CCD和CMOS相机中。
色彩空间的理论知识,到这里基本就讲解完成了,感兴趣的可以自己扩展最后几个数学公式。
LockedRectpBits里面保存到是从kenect传过来的位图数据,LockedRectPitch是每行位图的数据长度,合起来BYTE pBuffer = (BYTE)(LockedRectpBits)+iLockedRectPitch;,pBuffer就是目前正准备拷贝分位图数据的位置,这些代码就是把kinect传过来的数据拷贝到opencv的结构中,而kinect的位图的数据一个像素用四个字节保存,分别对应R,G,B,第四位暂时不用。
以上就是关于opencv怎么用./从文件夹读取全部的内容,包括:opencv怎么用./从文件夹读取、在vs2010中创建一空白图像,把从某一图片读取的数据(rgb值)赋值给它,用opencv怎么实现、Opencv数字图像处理颜色识别问题_opencv颜色分割等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)