使用Opencv实现Halcon中的动态阈值

  • 直接调用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;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/jgj123321/article/details/94575433