访问图像像素的三类方法

·方法一 指针访问:C操作符[ ];

·方法二 迭代器iterator;

·方法三 动态地址计算。

  1. #include <opencv2/core/core.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include <iostream>
  4. using namespace std;
  5. using namespace cv;
  6. //-----------------------------------【全局函数声明部分】-----------------------------------
  7. // 描述:全局函数声明
  8. //-----------------------------------------------------------------------------------------------
  9. void colorReduce(Mat& inputImage, Mat& outputImage, int div);
  10. void ShowHelpText();
  11. //--------------------------------------【main( )函数】---------------------------------------
  12. // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
  13. //-----------------------------------------------------------------------------------------------
  14. int main()
  15. {
  16. //【1】创建原始图并显示
  17. Mat srcImage = imread("G:\\1.jpg");
  18. imshow("原始图像", srcImage);
  19. //【2】按原始图的参数规格来创建创建效果图
  20. Mat dstImage;
  21. dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同
  22. ShowHelpText();
  23. //【3】记录起始时间
  24. double time0 = static_cast<double>(getTickCount());
  25. //【4】调用颜色空间缩减函数
  26. colorReduce(srcImage, dstImage, 32);
  27. //【5】计算运行时间并输出
  28. time0 = ((double)getTickCount() - time0) / getTickFrequency();
  29. cout << "\t此方法运行时间为: " << time0 << "秒" << endl; //输出运行时间
  30. //【6】显示效果图
  31. imshow("效果图", dstImage);
  32. waitKey(0);
  33. }
  34. //---------------------------------【colorReduce( )函数】---------------------------------
  35. // 描述:使用【指针访问:C操作符[ ]】方法版的颜色空间缩减函数
  36. //----------------------------------------------------------------------------------------------
  37. void colorReduce(Mat& inputImage, Mat& outputImage, int div)
  38. {
  39. //参数准备
  40. outputImage = inputImage.clone(); //拷贝实参到临时变量
  41. int rowNumber = outputImage.rows; //行数
  42. int colNumber = outputImage.cols*outputImage.channels(); //列数 x 通道数=每一行元素的个数
  43. //双重循环,遍历所有的像素值
  44. for (int i = 0; i < rowNumber; i++) //行循环
  45. {
  46. uchar* data = outputImage.ptr<uchar>(i); //获取第i行的首地址
  47. for (int j = 0; j < colNumber; j++) //列循环
  48. {
  49. // ---------【开始处理每个像素】-------------
  50. data[j] = data[j] / div * div + div / 2;
  51. // ----------【处理结束】---------------------
  52. } //行处理结束
  53. }
  54. }
  55. //-----------------------------------【ShowHelpText( )函数】----------------------------------
  56. // 描述:输出一些帮助信息
  57. //----------------------------------------------------------------------------------------------
  58. void ShowHelpText()
  59. {
  60. //输出欢迎信息和OpenCV版本
  61. printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
  62. printf("\n\n ----------------------------------------------------------------------------\n");
  63. }

用指针访问

如上所示

用迭代器



动态地址计算





大神的14种方法

  1. //---------------------------------【头文件、命名空间包含部分】-----------------------------
  2. // 描述:包含程序所使用的头文件和命名空间
  3. //-------------------------------------------------------------------------------------------------
  4. #include <iostream>
  5. #include <opencv2/core/core.hpp>
  6. #include <opencv2/highgui/highgui.hpp>
  7. using namespace cv;
  8. using namespace std;
  9. //---------------------------------【宏定义部分】---------------------------------------------
  10. // 描述:包含程序所使用宏定义
  11. //-------------------------------------------------------------------------------------------------
  12. #define NTESTS 14
  13. #define NITERATIONS 20
  14. //----------------------------------------- 【方法一】-------------------------------------------
  15. // 说明:利用.ptr 和 []
  16. //-------------------------------------------------------------------------------------------------
  17. void colorReduce0(Mat &image, int div = 64) {
  18. int nl = image.rows; //行数
  19. int nc = image.cols * image.channels(); //每行元素的总元素数量
  20. for (int j = 0; j < nl; j++)
  21. {
  22. uchar* data = image.ptr<uchar>(j);
  23. for (int i = 0; i < nc; i++)
  24. {
  25. //-------------开始处理每个像素-------------------
  26. data[i] = data[i] / div * div + div / 2;
  27. //-------------结束像素处理------------------------
  28. } //单行处理结束
  29. }
  30. }
  31. //-----------------------------------【方法二】-------------------------------------------------
  32. // 说明:利用 .ptr 和 * ++
  33. //-------------------------------------------------------------------------------------------------
  34. void colorReduce1(Mat &image, int div = 64) {
  35. int nl = image.rows; //行数
  36. int nc = image.cols * image.channels(); //每行元素的总元素数量
  37. for (int j = 0; j < nl; j++)
  38. {
  39. uchar* data = image.ptr<uchar>(j);
  40. for (int i = 0; i < nc; i++)
  41. {
  42. //-------------开始处理每个像素-------------------
  43. *data++ = *data / div * div + div / 2;
  44. //-------------结束像素处理------------------------
  45. } //单行处理结束
  46. }
  47. }
  48. //-----------------------------------------【方法三】-------------------------------------------
  49. // 说明:利用.ptr 和 * ++ 以及模操作
  50. //-------------------------------------------------------------------------------------------------
  51. void colorReduce2(Mat &image, int div = 64) {
  52. int nl = image.rows; //行数
  53. int nc = image.cols * image.channels(); //每行元素的总元素数量
  54. for (int j = 0; j < nl; j++)
  55. {
  56. uchar* data = image.ptr<uchar>(j);
  57. for (int i = 0; i < nc; i++)
  58. {
  59. //-------------开始处理每个像素-------------------
  60. int v = *data;
  61. *data++ = v - v % div + div / 2;
  62. //-------------结束像素处理------------------------
  63. } //单行处理结束
  64. }
  65. }
  66. //----------------------------------------【方法四】---------------------------------------------
  67. // 说明:利用.ptr 和 * ++ 以及位操作
  68. //----------------------------------------------------------------------------------------------------
  69. void colorReduce3(Mat &image, int div = 64) {
  70. int nl = image.rows; //行数
  71. int nc = image.cols * image.channels(); //每行元素的总元素数量
  72. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  73. //掩码值
  74. uchar mask = 0xFF << n; // e.g. 对于 div=16, mask= 0xF0
  75. for (int j = 0; j < nl; j++) {
  76. uchar* data = image.ptr<uchar>(j);
  77. for (int i = 0; i < nc; i++) {
  78. //------------开始处理每个像素-------------------
  79. *data++ = *data&mask + div / 2;
  80. //-------------结束像素处理------------------------
  81. } //单行处理结束
  82. }
  83. }
  84. //----------------------------------------【方法五】----------------------------------------------
  85. // 说明:利用指针算术运算
  86. //---------------------------------------------------------------------------------------------------
  87. void colorReduce4(Mat &image, int div = 64) {
  88. int nl = image.rows; //行数
  89. int nc = image.cols * image.channels(); //每行元素的总元素数量
  90. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  91. int step = image.step; //有效宽度
  92. //掩码值
  93. uchar mask = 0xFF << n; // e.g. 对于 div=16, mask= 0xF0
  94. //获取指向图像缓冲区的指针
  95. uchar *data = image.data;
  96. for (int j = 0; j < nl; j++)
  97. {
  98. for (int i = 0; i < nc; i++)
  99. {
  100. //-------------开始处理每个像素-------------------
  101. *(data + i) = *data&mask + div / 2;
  102. //-------------结束像素处理------------------------
  103. } //单行处理结束
  104. data += step; // next line
  105. }
  106. }
  107. //---------------------------------------【方法六】----------------------------------------------
  108. // 说明:利用 .ptr 和 * ++以及位运算、image.cols * image.channels()
  109. //-------------------------------------------------------------------------------------------------
  110. void colorReduce5(Mat &image, int div = 64) {
  111. int nl = image.rows; //行数
  112. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  113. //掩码值
  114. uchar mask = 0xFF << n; // e.g. 例如div=16, mask= 0xF0
  115. for (int j = 0; j < nl; j++)
  116. {
  117. uchar* data = image.ptr<uchar>(j);
  118. for (int i = 0; i < image.cols * image.channels(); i++)
  119. {
  120. //-------------开始处理每个像素-------------------
  121. *data++ = *data&mask + div / 2;
  122. //-------------结束像素处理------------------------
  123. } //单行处理结束
  124. }
  125. }
  126. // -------------------------------------【方法七】----------------------------------------------
  127. // 说明:利用.ptr 和 * ++ 以及位运算(continuous)
  128. //-------------------------------------------------------------------------------------------------
  129. void colorReduce6(Mat &image, int div = 64) {
  130. int nl = image.rows; //行数
  131. int nc = image.cols * image.channels(); //每行元素的总元素数量
  132. if (image.isContinuous())
  133. {
  134. //无填充像素
  135. nc = nc * nl;
  136. nl = 1; // 为一维数列
  137. }
  138. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  139. //掩码值
  140. uchar mask = 0xFF << n; // e.g. 比如div=16, mask= 0xF0
  141. for (int j = 0; j < nl; j++) {
  142. uchar* data = image.ptr<uchar>(j);
  143. for (int i = 0; i < nc; i++) {
  144. //-------------开始处理每个像素-------------------
  145. *data++ = *data&mask + div / 2;
  146. //-------------结束像素处理------------------------
  147. } //单行处理结束
  148. }
  149. }
  150. //------------------------------------【方法八】------------------------------------------------
  151. // 说明:利用 .ptr 和 * ++ 以及位运算 (continuous+channels)
  152. //-------------------------------------------------------------------------------------------------
  153. void colorReduce7(Mat &image, int div = 64) {
  154. int nl = image.rows; //行数
  155. int nc = image.cols; //列数
  156. if (image.isContinuous())
  157. {
  158. //无填充像素
  159. nc = nc * nl;
  160. nl = 1; // 为一维数组
  161. }
  162. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  163. //掩码值
  164. uchar mask = 0xFF << n; // e.g. 比如div=16, mask= 0xF0
  165. for (int j = 0; j < nl; j++) {
  166. uchar* data = image.ptr<uchar>(j);
  167. for (int i = 0; i < nc; i++) {
  168. //-------------开始处理每个像素-------------------
  169. *data++ = *data&mask + div / 2;
  170. *data++ = *data&mask + div / 2;
  171. *data++ = *data&mask + div / 2;
  172. //-------------结束像素处理------------------------
  173. } //单行处理结束
  174. }
  175. }
  176. // -----------------------------------【方法九】 ------------------------------------------------
  177. // 说明:利用Mat_ iterator
  178. //-------------------------------------------------------------------------------------------------
  179. void colorReduce8(Mat &image, int div = 64) {
  180. //获取迭代器
  181. Mat_<Vec3b>::iterator it = image.begin<Vec3b>();
  182. Mat_<Vec3b>::iterator itend = image.end<Vec3b>();
  183. for (; it != itend; ++it) {
  184. //-------------开始处理每个像素-------------------
  185. (*it)[0] = (*it)[0] / div * div + div / 2;
  186. (*it)[1] = (*it)[1] / div * div + div / 2;
  187. (*it)[2] = (*it)[2] / div * div + div / 2;
  188. //-------------结束像素处理------------------------
  189. }//单行处理结束
  190. }
  191. //-------------------------------------【方法十】-----------------------------------------------
  192. // 说明:利用Mat_ iterator以及位运算
  193. //-------------------------------------------------------------------------------------------------
  194. void colorReduce9(Mat &image, int div = 64) {
  195. // div必须是2的幂
  196. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  197. //掩码值
  198. uchar mask = 0xFF << n; // e.g. 比如 div=16, mask= 0xF0
  199. // 获取迭代器
  200. Mat_<Vec3b>::iterator it = image.begin<Vec3b>();
  201. Mat_<Vec3b>::iterator itend = image.end<Vec3b>();
  202. //扫描所有元素
  203. for (; it != itend; ++it)
  204. {
  205. //-------------开始处理每个像素-------------------
  206. (*it)[0] = (*it)[0] & mask + div / 2;
  207. (*it)[1] = (*it)[1] & mask + div / 2;
  208. (*it)[2] = (*it)[2] & mask + div / 2;
  209. //-------------结束像素处理------------------------
  210. }//单行处理结束
  211. }
  212. //------------------------------------【方法十一】---------------------------------------------
  213. // 说明:利用Mat Iterator_
  214. //-------------------------------------------------------------------------------------------------
  215. void colorReduce10(Mat &image, int div = 64) {
  216. //获取迭代器
  217. Mat_<Vec3b> cimage = image;
  218. Mat_<Vec3b>::iterator it = cimage.begin();
  219. Mat_<Vec3b>::iterator itend = cimage.end();
  220. for (; it != itend; it++) {
  221. //-------------开始处理每个像素-------------------
  222. (*it)[0] = (*it)[0] / div * div + div / 2;
  223. (*it)[1] = (*it)[1] / div * div + div / 2;
  224. (*it)[2] = (*it)[2] / div * div + div / 2;
  225. //-------------结束像素处理------------------------
  226. }
  227. }
  228. //--------------------------------------【方法十二】--------------------------------------------
  229. // 说明:利用动态地址计算配合at
  230. //-------------------------------------------------------------------------------------------------
  231. void colorReduce11(Mat &image, int div = 64) {
  232. int nl = image.rows; //行数
  233. int nc = image.cols; //列数
  234. for (int j = 0; j < nl; j++)
  235. {
  236. for (int i = 0; i < nc; i++)
  237. {
  238. //-------------开始处理每个像素-------------------
  239. image.at<Vec3b>(j, i)[0] = image.at<Vec3b>(j, i)[0] / div * div + div / 2;
  240. image.at<Vec3b>(j, i)[1] = image.at<Vec3b>(j, i)[1] / div * div + div / 2;
  241. image.at<Vec3b>(j, i)[2] = image.at<Vec3b>(j, i)[2] / div * div + div / 2;
  242. //-------------结束像素处理------------------------
  243. } //单行处理结束
  244. }
  245. }
  246. //----------------------------------【方法十三】-----------------------------------------------
  247. // 说明:利用图像的输入与输出
  248. //-------------------------------------------------------------------------------------------------
  249. void colorReduce12(const Mat &image, //输入图像
  250. Mat &result, // 输出图像
  251. int div = 64) {
  252. int nl = image.rows; //行数
  253. int nc = image.cols; //列数
  254. //准备好初始化后的Mat给输出图像
  255. result.create(image.rows, image.cols, image.type());
  256. //创建无像素填充的图像
  257. nc = nc * nl;
  258. nl = 1; //单维数组
  259. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  260. //掩码值
  261. uchar mask = 0xFF << n; // e.g.比如div=16, mask= 0xF0
  262. for (int j = 0; j < nl; j++) {
  263. uchar* data = result.ptr<uchar>(j);
  264. const uchar* idata = image.ptr<uchar>(j);
  265. for (int i = 0; i < nc; i++) {
  266. //-------------开始处理每个像素-------------------
  267. *data++ = (*idata++)&mask + div / 2;
  268. *data++ = (*idata++)&mask + div / 2;
  269. *data++ = (*idata++)&mask + div / 2;
  270. //-------------结束像素处理------------------------
  271. } //单行处理结束
  272. }
  273. }
  274. //--------------------------------------【方法十四】-------------------------------------------
  275. // 说明:利用操作符重载
  276. //-------------------------------------------------------------------------------------------------
  277. void colorReduce13(Mat &image, int div = 64) {
  278. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  279. //掩码值
  280. uchar mask = 0xFF << n; // e.g. 比如div=16, mask= 0xF0
  281. //进行色彩还原
  282. image = (image&Scalar(mask, mask, mask)) + Scalar(div / 2, div / 2, div / 2);
  283. }
  284. //-----------------------------------【ShowHelpText( )函数】-----------------------------
  285. // 描述:输出一些帮助信息
  286. //----------------------------------------------------------------------------------------------
  287. void ShowHelpText()
  288. {
  289. printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
  290. printf("\n\n ----------------------------------------------------------------------------\n");
  291. printf("\n\n正在进行存取操作,请稍等……\n\n");
  292. }
  293. //-----------------------------------【main( )函数】--------------------------------------------
  294. // 描述:控制台应用程序的入口函数,我们的程序从这里开始
  295. //-------------------------------------------------------------------------------------------------
  296. int main()
  297. {
  298. int64 t[NTESTS], tinit;
  299. Mat image0;
  300. Mat image1;
  301. Mat image2;
  302. system("color 4F");
  303. ShowHelpText();
  304. image0 = imread("G:\\1.jpg");
  305. if (!image0.data)
  306. return 0;
  307. //时间值设为0
  308. for (int i = 0; i < NTESTS; i++)
  309. t[i] = 0;
  310. // 多次重复测试
  311. int n = NITERATIONS;
  312. for (int k = 0; k < n; k++)
  313. {
  314. cout << k << " of " << n << endl;
  315. image1 = imread("G:\\1.jpg");
  316. //【方法一】利用.ptr 和 []
  317. tinit = getTickCount();
  318. colorReduce0(image1);
  319. t[0] += getTickCount() - tinit;
  320. //【方法二】利用 .ptr 和 * ++
  321. image1 = imread("G:\\1.jpg");
  322. tinit = getTickCount();
  323. colorReduce1(image1);
  324. t[1] += getTickCount() - tinit;
  325. //【方法三】利用.ptr 和 * ++ 以及模操作
  326. image1 = imread("G:\\1.jpg");
  327. tinit = getTickCount();
  328. colorReduce2(image1);
  329. t[2] += getTickCount() - tinit;
  330. //【方法四】 利用.ptr 和 * ++ 以及位操作
  331. image1 = imread("G:\\1.jpg");
  332. tinit = getTickCount();
  333. colorReduce3(image1);
  334. t[3] += getTickCount() - tinit;
  335. //【方法五】 利用指针的算术运算
  336. image1 = imread("G:\\1.jpg");
  337. tinit = getTickCount();
  338. colorReduce4(image1);
  339. t[4] += getTickCount() - tinit;
  340. //【方法六】利用 .ptr 和 * ++以及位运算、image.cols * image.channels()
  341. image1 = imread("G:\\1.jpg");
  342. tinit = getTickCount();
  343. colorReduce5(image1);
  344. t[5] += getTickCount() - tinit;
  345. //【方法七】利用.ptr 和 * ++ 以及位运算(continuous)
  346. image1 = imread("G:\\1.jpg");
  347. tinit = getTickCount();
  348. colorReduce6(image1);
  349. t[6] += getTickCount() - tinit;
  350. //【方法八】利用 .ptr 和 * ++ 以及位运算 (continuous+channels)
  351. image1 = imread("G:\\1.jpg");
  352. tinit = getTickCount();
  353. colorReduce7(image1);
  354. t[7] += getTickCount() - tinit;
  355. //【方法九】 利用Mat_ iterator
  356. image1 = imread("G:\\1.jpg");
  357. tinit = getTickCount();
  358. colorReduce8(image1);
  359. t[8] += getTickCount() - tinit;
  360. //【方法十】 利用Mat_ iterator以及位运算
  361. image1 = imread("G:\\1.jpg");
  362. tinit = getTickCount();
  363. colorReduce9(image1);
  364. t[9] += getTickCount() - tinit;
  365. //【方法十一】利用Mat Iterator_
  366. image1 = imread("G:\\1.jpg");
  367. tinit = getTickCount();
  368. colorReduce10(image1);
  369. t[10] += getTickCount() - tinit;
  370. //【方法十二】 利用动态地址计算配合at
  371. image1 = imread("G:\\1.jpg");
  372. tinit = getTickCount();
  373. colorReduce11(image1);
  374. t[11] += getTickCount() - tinit;
  375. //【方法十三】 利用图像的输入与输出
  376. image1 = imread("G:\\1.jpg");
  377. tinit = getTickCount();
  378. Mat result;
  379. colorReduce12(image1, result);
  380. t[12] += getTickCount() - tinit;
  381. image2 = result;
  382. //【方法十四】 利用操作符重载
  383. image1 = imread("G:\\1.jpg");
  384. tinit = getTickCount();
  385. colorReduce13(image1);
  386. t[13] += getTickCount() - tinit;
  387. //------------------------------
  388. }
  389. //输出图像
  390. imshow("原始图像", image0);
  391. imshow("结果", image2);
  392. imshow("图像结果", image1);
  393. // 输出平均执行时间
  394. cout << endl << "-------------------------------------------" << endl << endl;
  395. cout << "\n【方法一】利用.ptr 和 []的方法所用时间为 " << 1000.*t[0] / getTickFrequency() / n << "ms" << endl;
  396. cout << "\n【方法二】利用 .ptr 和 * ++ 的方法所用时间为" << 1000.*t[1] / getTickFrequency() / n << "ms" << endl;
  397. cout << "\n【方法三】利用.ptr 和 * ++ 以及模操作的方法所用时间为" << 1000.*t[2] / getTickFrequency() / n << "ms" << endl;
  398. cout << "\n【方法四】利用.ptr 和 * ++ 以及位操作的方法所用时间为" << 1000.*t[3] / getTickFrequency() / n << "ms" << endl;
  399. cout << "\n【方法五】利用指针算术运算的方法所用时间为" << 1000.*t[4] / getTickFrequency() / n << "ms" << endl;
  400. cout << "\n【方法六】利用 .ptr 和 * ++以及位运算、channels()的方法所用时间为" << 1000.*t[5] / getTickFrequency() / n << "ms" << endl;
  401. cout << "\n【方法七】利用.ptr 和 * ++ 以及位运算(continuous)的方法所用时间为" << 1000.*t[6] / getTickFrequency() / n << "ms" << endl;
  402. cout << "\n【方法八】利用 .ptr 和 * ++ 以及位运算 (continuous+channels)的方法所用时间为" << 1000.*t[7] / getTickFrequency() / n << "ms" << endl;
  403. cout << "\n【方法九】利用Mat_ iterator 的方法所用时间为" << 1000.*t[8] / getTickFrequency() / n << "ms" << endl;
  404. cout << "\n【方法十】利用Mat_ iterator以及位运算的方法所用时间为" << 1000.*t[9] / getTickFrequency() / n << "ms" << endl;
  405. cout << "\n【方法十一】利用Mat Iterator_的方法所用时间为" << 1000.*t[10] / getTickFrequency() / n << "ms" << endl;
  406. cout << "\n【方法十二】利用动态地址计算配合at 的方法所用时间为" << 1000.*t[11] / getTickFrequency() / n << "ms" << endl;
  407. cout << "\n【方法十三】利用图像的输入与输出的方法所用时间为" << 1000.*t[12] / getTickFrequency() / n << "ms" << endl;
  408. cout << "\n【方法十四】利用操作符重载的方法所用时间为" << 1000.*t[13] / getTickFrequency() / n << "ms" << endl;
  409. waitKey();
  410. system("pause");
  411. return 0;
  412. }

不稳定的fast

  1. #include <iostream>
  2. #include <opencv2/core/core.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. void colorReduce13(Mat &image, int div = 64) {
  7. int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0));
  8. uchar mask = 0xFF << n;
  9. image = (image&Scalar(mask, mask, mask)) + Scalar(div / 2, div / 2, div / 2);
  10. }
  11. int main()
  12. {
  13. Mat srcImage = imread("G:\\1.jpg");
  14. imshow("原始图像", srcImage);
  15. double time0 = static_cast<double>(getTickCount());
  16. colorReduce13(srcImage, 32);
  17. time0 = ((double)getTickCount() - time0) / getTickFrequency();
  18. cout << "\t此方法运行时间为: " << time0 << "秒" << endl; //输出运行时间
  19. imshow("效果图", srcImage);
  20. waitKey(0);
  21. }

opencv 3 core组件进阶(1 访问图像中的像素)的更多相关文章

  1. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  2. OpenCV之Core组件进阶

    颜色空间缩减 利用C++类型转换时向下取整操作,实现定义域内颜色缩减.表达式如下 Inew = (Iold/10)*10 简单的颜色空间缩减算法可由以下两步组成: (1)遍历图像矩阵的每个元素 (2) ...

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

    再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...

  4. opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)

    离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...

  5. opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)

    ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ...

  6. 【OpenCV】访问图像中每个像素的值

    http://blog.csdn.net/xiaowei_cqu/article/details/7557063

  7. opencv core组件进阶

    1.图像在内存中存储方式,图像矩阵的大小取决于颜色模型,取决于所有的通道数:还有重要的颜色空间缩减的概念:因为如果是RGB的话,使用uchar的话,就有256^3的结合方法.所以要用到颜色缩减的方法, ...

  8. core组件进阶

    访问图像像素 存储方式 BGR连续存储有助于提升图像扫描速度. isContinuous()判断是否是连续存储. 颜色空间缩减 仅用这些颜色中具有代表性的很小的部分,就足以达到同样的效果. 将现有颜色 ...

  9. (转)OpenCV 访问Mat中每个像素的值

    转自:http://blog.csdn.net/xiaowei_cqu/article/details/19839019 在<OpenCV 2 Computer Vision Applicati ...

随机推荐

  1. 说说Object类下面有几种方法呢?

    今天说一道基础题型,不过很多人会忽略或者至少说不完整,但是面试时被问到的几率还是很大的. 面试题 Object有几种方法呢? Java语言是一种单继承结构语言,Java中所有的类都有一个共同的祖先.这 ...

  2. Opentracing + Uber Jaeger 全链路灰度调用链,Nepxion Discovery

    当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...

  3. 下载达 10 万次的 IDEA 插件,K8s 一键部署了解一下?

    作者 | 铃儿响叮当 导读:涉及开发的技术人员,永远绕不开的就是将应用部署到相应服务器上,本文将给大家讲解:对于容器服务 ACK,怎么实现真正"一键部署",提高开发部署效率,在 K ...

  4. 不想用锐捷怎么办?锐捷出问题|锐捷不能用怎么办?用menohust代替吧

    首先获取 MentoHUST(代替锐捷网络认证客户端) V4.1.0.2001 绿色免费版 解压到任意目录 用管理员身份 启动  安装&卸载 .bat(右键用管理员运行)  这个文件可能乱码了 ...

  5. CPU爆满后的无助感

    告警 晚七点刚好上地铁,握在手里的手机震动了好几下,根据震动这几下的手感已经判断出这是钉钉在告警了,十有八九就是线上的问题,通过Zabbix监控的一台线上服务器已经五分钟不可达,这应该不会是网络网络问 ...

  6. vim配置(vimplus)教程及问题

    An automatic configuration program for vim 安装(github地址:https://github.com/chxuan/vimplus.git, 欢迎star ...

  7. vue运行报错error:Cannot assign to read only property 'exports' of object '#<Object>'

    用weex做项目的时候,npm start 之后一直报错error:Cannot assign to read only property 'exports' of object '#<Obje ...

  8. web.xml不同版本的头信息

    web.xml v2.3 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web- ...

  9. Windows中的JDK和Linux中的JDK是否相同

    前言 在面试中,被问到了一个问题: Windows中的JDK和Linux中的JDK是否相同? 其实,以上这个问题是一个子问题.原本的问题是:如何理解Java的跨平台机制.由于原问题显得有些宽泛,因此延 ...

  10. Windows机器配置启动加载器的高级选项后,机器出现蓝屏,无法RDP

    问题描述: 虚拟机重启后出现蓝屏,需要排查原因 蓝屏界面如下: 排查结果: 1.Console发现机器停留在上述蓝屏界面,按F8后,机器可以正常启动并成功连接:但通过console再次重启后,又会进入 ...