opencv怎么用.从文件夹读取

opencv怎么用.从文件夹读取,第1张

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 Image

import 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颜色分割等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9302895.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存