赞
踩
-
- //
- //opencv4.1.0
- //
-
- #include <opencv2/opencv.hpp>
-
- using namespace std;
- using namespace cv;
-
- int main() {
- Mat src, srcMean, SubImage, dstImage;
- src = imread("1.png",0);
-
- blur(src, srcMean, Size(9, 9));
- subtract(src, srcMean, SubImage);
- //addWeighted(src,-1,srcMean,1,0,SubImage); //可以利用图像权重相加的函数实现图像相减
- threshold(SubImage, dstImage, 5, 255, THRESH_BINARY);
- imshow("动态阈值", dstImage);
-
- waitKey(0);
- return 0;
- }

效果图:
原图
Light模式结果图
代码:
-
- //
- //opencv4.1.0
- //
-
- #include <opencv2/opencv.hpp>
-
- using namespace std;
- using namespace cv;
-
- //实现Halcon里的动态阈值
- void DynThreshold(Mat& src,Mat& srcMean,Mat& reslut, int offset,int LightDark);
- //枚举定义动态阈值的模式
- enum Dyn
- {
- Light = 1,
- Dark,
- Equal,
- Not_equal
- };
-
- int main() {
- Mat src, srcMean;
- src = imread("1.png",0);
-
- //均值滤波
- blur(src, srcMean, Size(9, 9));
-
- //动态阈值
- Mat result = Mat::zeros(src.size(), CV_8UC1);
- DynThreshold(src, srcMean, result, 5, Light);
-
- imshow("原图", src);
- imshow("均值滤波", srcMean);
- imshow("动态阈值", result);
- waitKey(0);
- return 0;
- }
-
- void DynThreshold(Mat& src, Mat& srcMean, Mat& result, int offset, int LightDark) {
-
- int r = src.rows;//高
- int c = src.cols;//宽
- int Value = 0;
- for (int i = 0; i < r; i++){
- uchar* datasrc = src.ptr<uchar>(i); //指针访问图像像素
- uchar* datasrcMean = srcMean.ptr<uchar>(i);
- uchar* dataresult = result.ptr<uchar>(i);
- for (int j = 0; j < c; j++){
- switch (LightDark)
- {
- case 1:
- Value = datasrc[j] - datasrcMean[j];
- if (Value >= offset) {
- dataresult[j] = 255;
- }
- break;
- case 2:
- Value = datasrcMean[j] - datasrc[j];
- if (Value >= offset) {
- dataresult[j] = 255;
- }
- break;
- case 3:
- Value = datasrc[j] - datasrcMean[j];
- if (Value >= -offset && Value <= offset) {
- dataresult[j] = 255;
- }
- break;
- case 4:
- Value = datasrc[j] - datasrcMean[j];
- if (Value < -offset || Value > offset) {
- dataresult[j] = 255;
- }
- break;
- default:
- break;
- }
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。