【OpenCV图像处理】一、图像相加、相减、相乘与相除的实现

看完了数字图像处理后,从头开始使用opencv进行相关内容的实现,使用的环境是VS2013+OpenCV2.4.9

1.图像的加运算

加运算就是两幅图像对应像素的灰度值或彩色分量进行相加。主要有两种用途,一种是消除图像的随机噪声,主要做是讲同一场景的图像进行相加后再取平均;另一种是用来做特效,把多幅图像叠加在一起,再进一步进行处理。

对于灰度图像,因为只有单通道,所以直接进行相应位置的像素加法即可,对于彩色图像,则应该将对应的颜色的分量分别进行相加。

通常来将,两幅或多幅相加的图像的大小和尺寸应该相同。

以下为代码部分,使用了两种方法进行实现,一是使用迭代器进行图像的遍历进行相加,另一种是使用OpenCV中的addWeighted函数进行线性相加。

经过师兄提醒,在这里补充一下,在OpenCV中除了上述使用函数的方法外,还可以直接运用运算符进行操作,例如在求两个图像的和的时候,可以直接写为

result1 = (img1 + img2) / 2;
      
      
      
      
在进行二值化时,再将图像灰度化后,可以直接使用类似语句

result = (img1 > 30);
      
      
      
      

在实际的使用中,灵活的运用运算符进行图像的操作可以带来很大的方便。


PS:再次感谢师兄的提醒 :D 





     
     
     
     
  1. //本程序实现将两张尺寸相同的图像进行相加
  2. //在对像素进行操作时,使用的时迭代器的方法
  3. //2017-02-18
  4. #include
  5. #include
  6. #include
  7. using namespace cv;
  8. using namespace std;
  9. int main()
  10. {
  11. Mat img1, img2, result1;
  12. img1 = imread( "1234.jpg");
  13. img2 = imread( "2345.jpg");
  14. result1 = img1.clone();
  15. Mat_::iterator it = result1.begin(); //result1初始位置的迭代器
  16. Mat_::iterator itend = result1.end(); //result1终止位置的迭代器
  17. Mat_::iterator it1 = img1.begin(); //img1初始迭代器
  18. Mat_::iterator it2 = img2.begin(); //img2初始迭代器
  19. //进行遍历
  20. for (; it != itend; it++)
  21. {
  22. (*it)[ 0] = ((*it1)[ 0] + (*it2)[ 0]) / 2;
  23. (*it)[ 1] = ((*it1)[ 1] + (*it2)[ 1]) / 2;
  24. (*it)[ 2] = ((*it1)[ 2] + (*it2)[ 2]) / 2;
  25. it1++;
  26. it2++;
  27. }
  28. namedWindow( "原图1", 1);
  29. imshow( "原图1", img1);
  30. namedWindow( "原图2", 0);
  31. imshow( "原图2", img2);
  32. namedWindow( "相加后的图像", 0);
  33. imshow( "相加后的图像", result1);
  34. Mat result2 = result1.clone();
  35. addWeighted(img1, 1, img2, 1, 0,result2);
  36. namedWindow( "addWeighted");
  37. imshow( "addWeighted", result2);
  38. waitKey();
  39. return 0;
  40. }


运行结果为:




2.图像相减

减法运算就是两幅图像见对象像素的灰度值或彩色分量进行相减,它可以用于目标检测,程序实现还是使用两种方法。

以下为程序部分


     
     
     
     
  1. //本程序实现两个尺寸相同的图像进行相减的操作
  2. //分别使用遍历像素的方法和addWeighted的方法
  3. #include
  4. #include
  5. #include
  6. using namespace std;
  7. using namespace cv;
  8. uchar toZero(uchar a); //置零函数,小于零则为0
  9. int main()
  10. {
  11. Mat imag1, imag2, result1, result2;
  12. imag1 = imread( "2345.jpg");
  13. imag2 = imread( "1234.jpg");
  14. result1 = imag1.clone();
  15. result2 = imag2.clone();
  16. int rowNumber = result1.rows;
  17. int colNumber = result1.cols;
  18. for ( int i = 0; i < rowNumber; i++)
  19. {
  20. for ( int j = 0; j < colNumber; j++)
  21. {
  22. result1.at(i, j)[ 0] = toZero(imag1.at(i, j)[ 0] - imag2.at(i, j)[ 0]);
  23. result1.at(i, j)[ 1] = toZero(imag1.at(i, j)[ 1] - imag2.at(i, j)[ 1]);
  24. result1.at(i, j)[ 2] = toZero(imag1.at(i, j)[ 2] - imag2.at(i, j)[ 2]);
  25. }
  26. }
  27. //addWeighted方法进行图像相减
  28. addWeighted(imag1, 1, imag2, -1, 0,result2);
  29. imshow( "原图1", imag1);
  30. imshow( "原图2", imag2);
  31. imshow( "result1", result1);
  32. imshow( "addWeighted", result2);
  33. waitKey();
  34. return 0;
  35. }
  36. uchar toZero(uchar a)
  37. {
  38. if (a < 0)
  39. return 0;
  40. else
  41. return a;
  42. }


运行结果为:


result1貌似有问题,需要进一步进行检查。


3.图像相乘

图像的乘法运算就是将两幅图像对应的灰度值或彩色分量进行相乘。

乘运算的主要作用是抑制图像的某些区域,掩膜值置为1,否则置为0。乘运算有时也被用来实现卷积或相关的运算。

以下为相关程序代码。



     
     
     
     
  1. //图像的乘运算。
  2. //将两幅图像对应的灰度值或彩色分量进行相乘。
  3. #include
  4. #include
  5. #include
  6. using namespace std;
  7. using namespace cv;
  8. int main()
  9. {
  10. Mat imag1, imag2, result;
  11. imag1 = imread( "1234.jpg");
  12. imag2 = imread( "2345.jpg");
  13. result = imag1.clone();
  14. int rowNumber = result.rows;
  15. int colNumber = result.cols;
  16. for ( int i = 0; i < rowNumber; i++)
  17. {
  18. for ( int j = 0; j < colNumber; j++)
  19. {
  20. result.at(i, j)[ 0] = (imag1.at(i, j)[ 0] * imag2.at(i, j)[ 0]) % 256;
  21. result.at(i, j)[ 1] = (imag1.at(i, j)[ 1] * imag2.at(i, j)[ 1]) % 256;
  22. result.at(i, j)[ 2] = (imag1.at(i, j)[ 2] * imag2.at(i, j)[ 2]) % 256;
  23. }
  24. }
  25. imshow( "原图1", imag1);
  26. imshow( "原图2", imag2);
  27. imshow( "相乘后的图像", result);
  28. waitKey();
  29. return 0;
  30. }

实验的结果如下:



4.图像相除

图像除运算就是两幅图像对应像素的灰度值或彩色分量进行相除。

简单的出运算可以用于改变图像的灰度级


以下为代码部分



     
     
     
     
  1. //图像的除法运算
  2. //就是讲两幅图像的对应像素的灰度值或彩色分量进行相除。
  3. //简单的除运算可以用来改变图像的灰度级。
  4. #include
  5. #include
  6. #include
  7. using namespace std;
  8. using namespace cv;
  9. int main()
  10. {
  11. Mat imag1, imag2, result;
  12. imag2 = imread( "1234.jpg");
  13. imag1 = imread( "2345.jpg");
  14. result = imag1.clone();
  15. int rowNumber = result.rows;
  16. int colNumber = result.cols;
  17. for ( int i = 0; i < rowNumber; i++)
  18. {
  19. for ( int j = 0; j < colNumber; j++)
  20. {
  21. result.at(i, j)[ 0] = (imag1.at(i, j)[ 0] * 1.0) / imag2.at(i, j)[ 0];
  22. result.at(i, j)[ 1] = (imag1.at(i, j)[ 1] * 1.0) / imag2.at(i, j)[ 1];
  23. result.at(i, j)[ 2] = (imag1.at(i, j)[ 2] * 1.0) / imag2.at(i, j)[ 2];
  24. }
  25. }
  26. imshow( "原图1", imag1);
  27. imshow( "原图2", imag2);
  28. imshow( "相除后的图像", result);
  29. waitKey();
  30. return 0;
  31. }

转载自:https://blog.csdn.net/qq_34784753/article/details/55667671?locationNum=1&fps=1

你可能感兴趣的:(OpenCV)