博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINUX 下Open cv练习使用小记(2)
阅读量:6285 次
发布时间:2019-06-22

本文共 4969 字,大约阅读时间需要 16 分钟。

第二节记录一下自己学习图像遍历的一点点代码,摘自《opencv2编程手册》(张静译)

第一个代码是最简单的强行修改像素(添加椒盐噪声)

1 #include 
2 #include
3 4 void salt(cv::Mat &image, int n) { 5 6 int i,j; 7 for (int k=0; k
(j,i)= 255; 17 18 } else if (image.channels() == 3) { // color image19 20 image.at
(j,i)[0]= 255; 21 image.at
(j,i)[1]= 255; 22 image.at
(j,i)[2]= 255; 23 }24 }25 }26 27 int main()28 {29 srand(cv::getTickCount()); // init random number generator30 31 cv::Mat image= cv::imread("../cat.jpg",0);32 33 salt(image,3000);34 35 cv::namedWindow("Image");36 cv::imshow("Image",image);37 38 cv::imwrite("salted.bmp",image);39 40 cv::waitKey(5000);41 42 return 0;43 }

书上的注释为image.<unchar>(j,i)=255,将i行j列的数据变为白色。

第二个程序才开始真正的遍历

 

1 #include 
2 #include
3 4 void colorReduce0(cv::Mat &image, int div=64) { 5 6 int nl= image.rows; // 每行的像素数目 7 int nc= image.cols * image.channels(); // total number of elements per line 8 9 for (int j=0; j
(j);//此句返回j行的首地址12 13 for (int i=0; i

这个程序写的是对小猫的颜色进行缩减,效果如下

另,对像素的操作可以采用

*data++ =*data/div*div + div/2

来书写

 接下来,我就继续看第二种颜色缩进的算法

1 void colorReduce1(cv::Mat &image, int div=64) { 2  3       int nl= image.rows; // number of lines 4       int nc= image.cols * image.channels(); // total number of elements per line 5                6       for (int j=0; j
(j); 9 10 for (int i=0; i

效果如下

到这里我就整个人变傻了。两个算法不是一样的吗-  -,为什么效果差别这么大-  -

算了,还是将人家给的代码放出吧,希望有大神指正

#include 
#include
#include
// using .ptr and []void colorReduce0(cv::Mat &image, int div=64) { int nl= image.rows; // number of lines int nc= image.cols * image.channels(); // total number of elements per line for (int j=0; j
(j); for (int i=0; i
(j); for (int i=0; i
(j); for (int i=0; i
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<
(j); for (int i=0; i
(log(static_cast
(div))/log(2.0)); int step= image.step; // effective width // mask used to round the pixel value uchar mask= 0xFF<
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<
(j); for (int i=0; i
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<
(j); for (int i=0; i
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<
(j); for (int i=0; i
::iterator it= image.begin
(); cv::Mat_
::iterator itend= image.end
(); for ( ; it!= itend; ++it) { // process each pixel --------------------- (*it)[0]= (*it)[0]/div*div + div/2; (*it)[1]= (*it)[1]/div*div + div/2; (*it)[2]= (*it)[2]/div*div + div/2; // end of pixel processing ---------------- }}// using Mat_ iterator and bitwisevoid colorReduce9(cv::Mat &image, int div=64) { // div must be a power of 2 int n= static_cast
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<
::iterator it= image.begin
(); cv::Mat_
::iterator itend= image.end
(); // scan all pixels for ( ; it!= itend; ++it) { // process each pixel --------------------- (*it)[0]= (*it)[0]&mask + div/2; (*it)[1]= (*it)[1]&mask + div/2; (*it)[2]= (*it)[2]&mask + div/2; // end of pixel processing ---------------- }}// using MatIterator_ void colorReduce10(cv::Mat &image, int div=64) { // get iterators cv::Mat_
cimage= image; cv::Mat_
::iterator it=cimage.begin(); cv::Mat_
::iterator itend=cimage.end(); for ( ; it!= itend; it++) { // process each pixel --------------------- (*it)[0]= (*it)[0]/div*div + div/2; (*it)[1]= (*it)[1]/div*div + div/2; (*it)[2]= (*it)[2]/div*div + div/2; // end of pixel processing ---------------- }}void colorReduce11(cv::Mat &image, int div=64) { int nl= image.rows; // number of lines int nc= image.cols; // number of columns for (int j=0; j
(j,i)[0]= image.at
(j,i)[0]/div*div + div/2; image.at
(j,i)[1]= image.at
(j,i)[1]/div*div + div/2; image.at
(j,i)[2]= image.at
(j,i)[2]/div*div + div/2; // end of pixel processing ---------------- } // end of line }}// with input/ouput imagesvoid colorReduce12(const cv::Mat &image, // input image cv::Mat &result, // output image int div=64) { int nl= image.rows; // number of lines int nc= image.cols ; // number of columns // allocate output image if necessary result.create(image.rows,image.cols,image.type()); // created images have no padded pixels nc= nc*nl; nl= 1; // it is now a 1D array int n= static_cast
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<
(j); const uchar* idata= image.ptr
(j); for (int i=0; i
(log(static_cast
(div))/log(2.0)); // mask used to round the pixel value uchar mask= 0xFF<

 

转载于:https://www.cnblogs.com/BIGShengun/p/5149202.html

你可能感兴趣的文章
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>
android中用ExpandableListView实现三级扩展列表
查看>>
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>
python多线程队列安全
查看>>
[汇编语言学习笔记][第四章第一个程序的编写]
查看>>
android 打开各种文件(setDataAndType)转:
查看>>
补交:最最原始的第一次作业(当时没有选上课,所以不知道)
查看>>
Vue实例初始化的选项配置对象详解
查看>>
PLM产品技术的发展趋势 来源:e-works 作者:清软英泰 党伟升 罗先海 耿坤瑛
查看>>
vue part3.3 小案例ajax (axios) 及页面异步显示
查看>>
浅谈MVC3自定义分页
查看>>
.net中ashx文件有什么用?功能有那些,一般用在什么情况下?
查看>>
select、poll、epoll之间的区别总结[整理]【转】
查看>>