-
直接调用Opencv的函数实现
//////////////////////////////////
//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;
}
-
dyn_threshold算子使用C++实现
效果图:
原图
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;
}
}
}
}