opencv5-读取像素

来源:互联网 发布:火鸟编程 编辑:程序博客网 时间:2024/05/17 15:40

题外话:像素大战,感兴趣的可以去看这个电影,就能更好的理解像素是个什么东东。

像素(pixel):由Picture图像和Element元素组成,是图片视频的基本单元。也就是我们通常说的分辨率。当图片尺寸以像素为单位时,每一厘米等于28像素,比如15*15厘米的图片,等于420*420像素的长度。

opencv中经常出现通道,所以在单通道、多通道下的图像的像素是这样表示的

图画的不好看,明天补上!



1、存取像素at(int x,int y);

要指定元素所在的行和列。若图像是单通道,返回值是单个数值,若图像是多通道,返回值是一组向量(vector)。

cv::Mat的公有成员变量colsrows给出了图像的宽和高

at()函数的使用,有一点很重要,在编译时要知道图像的数据类型。

单通道:

image.at<uchar>(j,i)=value;

多通道:

image.at<Vec3b>(j,i)[0] =value;

image.at<Vec3b>( j,i)[1] =value;

image.at<Vec3b>( j,i)[2] =value;

 

at中(i,j)的顺序表示的是第i行第j列,跟Point(i,j)和Rect(i,j)中表示第j行第i列是相反的,所以上面都写为at(j,i).这一点不注意非常容易出现内存异常的错误。


图像遍历是图像处理中少不了的,一般有指针和迭代器两种方式。

2、指针遍历

其只能针对没有经过填充的连续图像。判断方法调用isContinuous,返回值为TRUEfalse

3迭代器

在面向对象编程中,遍历数据集合通常都是通过迭代器完成的。迭代器是一种特殊的类,专门用来遍历集合中的各个元素,同时隐藏在给定的集合上元素迭代的具体实现方式

/**本程序是学会使用:1、用下标访问像素,2、使用迭代器访问像素 , 3、使用指针访问像素*4、把图像写入磁盘***/#include <opencv2/highgui/highgui.hpp>//访问元素用下标/*这个函数每次循环都将一个随机选取的像素的值设置为255,随机选取的像素的行号i和列j 是通过随机函数得到的。通过检查图像的通道数来区分灰度和彩色图,对于灰度图直接将像素值设置为255,对于彩色图,需要将每一个通道值都设置为255才能得到一个白色像素。*/void salt(cv::Mat &img , int n){for(int k = 0 ; k < n ; ++ k){int i = rand() % img.cols ;int j = rand() % img.rows ;//灰度图if(1 == img.channels()){img.at<uchar>(j , i) = 255 ;}//彩色图else if(3 == img.channels()){img.at<cv::Vec3b>(j , i)[0] = 255 ;img.at<cv::Vec3b>(j , i)[1] = 255 ;img.at<cv::Vec3b>(j , i)[2] = 255 ;}}//扩展://cv::Mat_<uchar> im1 = img ;//im1(50 , 100) = 0 ;//对于已经知道返回类型时 可以这样访问元素}//减少图像颜色数void colorReduce(cv::Mat &img , int div = 64){//行数int rowsNum = img.rows ;//每行的元素个数int closPiexlNum = img.cols * img.channels() ;for(int i = 0 ; i < rowsNum ; ++ i){//得到j行首地址uchar *data = img.ptr<uchar>(i) ;for(int j = 0 ; j < closPiexlNum ; ++ j){//处理每个像素data[j] = data[j] / div * div + div / 2 ;}}}void colorReduce3(cv::Mat img , cv::Mat &result , int div = 64){result.create(img.rows , img.cols , img.type()) ;int rowsNum = img.rows ;int closPiexlNum = img.cols * img.channels() ;for(int i = 0 ; i < rowsNum ; ++ i){uchar *data_in = img.ptr<uchar>(i) ;uchar *data_out = result.ptr<uchar>(i) ;for(int j = 0 ; j < closPiexlNum ; ++ j){data_out[j] = data_in[j] / div * div + div / 2 ;}}}void colorReduce4(cv::Mat img , cv::Mat &result , int div = 64){//result.create(img.rows , img.cols , img.type()) ;result = img.clone() ;//注意两种迭代器的定义方法cv::MatIterator_<cv::Vec3b>   itStart = result.begin<cv::Vec3b>() ;cv::Mat_<cv::Vec3b>::iterator itEnd = result.end<cv::Vec3b>() ;while(itStart != itEnd){(*itStart)[0] = (*itStart)[0] / div * div + div / 2 ;(*itStart)[1] = (*itStart)[1] / div * div + div / 2 ;(*itStart)[2] = (*itStart)[2] / div * div + div / 2 ;itStart ++ ;}//Const迭代器两种定义方法//cv::MatConstIterator_<cv::Vec3b> it ;//cv::Mat_<cv::Vec3b>::const_iterator it ;}void colorReduce5(cv::Mat img , cv::Mat &result , int div = 64){result = img.clone() ;int rNum = result.rows ;int cNum = result.cols ;if(result.isContinuous()){cNum *= rNum ;rNum = 1 ;}int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0)) ;uchar mask = 0xFF << n ;for(int i = 0 ; i < rNum ; ++ i){uchar *data = result.ptr<uchar>(i) ;for(int j = 0 ; j < cNum ; ++ j){*data++ = *data & mask + div / 2 ;*data++ = *data & mask + div / 2 ;*data++ = *data & mask + div / 2 ;}}}void colorReduce6(cv::Mat img , cv::Mat &result , int div = 64){int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0)) ;uchar mask = 0xFF << n ;result = (img & cv::Scalar(mask , mask , mask)       + cv::Scalar(div / 2 , div / 2 , div / 2)) ;}int main(){cv::Mat img ;img = cv::imread("E://Baboon.jpg") ; cv::namedWindow("Original") ;cv::imshow("Original" , img) ;//salt(img , 3000) ;//colorReduce(img , 64) ;//cv::Mat imgClone = img.clone() ;cv::Mat result ;//colorReduce3(img , result) ;//使用指针//colorReduce4(img , result) ;//使用迭代器//colorReduce5(img , result) ;//使用位运算colorReduce6(img , result) ;//简洁的写法cv::namedWindow("Result") ;cv::imshow("Result" , result) ;//cv::imwrite("result.jpg" , img) ;//把图像写在磁盘上cv::waitKey() ;return 0 ;}






原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一个月婴儿呕奶严重怎么办 6岁宝宝大便干燥怎么办 3岁儿童干咳嗽怎么办 3岁宝宝一直咳嗽怎么办 3岁宝宝风寒咳嗽怎么办 刚出生的宝宝拉奶瓣怎么办 小孩拉痢疾带血怎么办 2岁宝宝有点拉稀怎么办 1岁宝宝有点拉稀怎么办 3岁宝宝有点拉稀怎么办 甲减粘液性水肿怎么办 五个月宝宝断奶不吃奶粉怎么办 八个半月的宝宝不爱吃饭怎么办 十个半月宝宝不爱吃饭怎么办 九个半月宝宝不爱吃饭怎么办 七个半月宝宝不爱吃饭怎么办 8个半月宝宝不爱吃饭怎么办 八个半月宝宝不爱吃饭怎么办 特百惠杯子摔坏后不给换怎么办 特百惠水杯摔裂了怎么办 焖烧杯摔瘪了怎么办 苦瓜和虾一起吃中毒怎么办 乐扣盖子坏了怎么办 小孩上课坐不住好动怎么办 5小孩晚上不睡觉怎么办 一年级的孩子上课好动怎么办 一岁宝宝太好动怎么办 3岁宝宝太好动怎么办 孩子学习注意力不集中怎么办 1岁宝宝皮肤黄怎么办 三岁宝宝太皮怎么办 一岁宝宝太皮了怎么办 5岁宝宝学习太皮怎么办 2岁宝宝太皮了怎么办 身上的皮肤很干怎么办 小孩子挑食厌食不吃饭怎么办 1岁宝宝特别淘气怎么办 4岁宝宝有多动症怎么办 3岁宝宝有多动症怎么办 6个月婴儿睡眠少怎么办 7个月婴儿睡眠少怎么办