OpenCV-自适应阈值分割

步骤:1、输入原图像,并进行滤波平滑处理;2、将原图像与滤波图像做差处理;3、结果图像通过判断像素点是否大于0而进行阈值分割,也可以自行设置T的大小。

C++:

#include
#include
using namespace std;
using namespace cv;

Mat adaptthreshold(Mat image)
{
	image.convertTo(image, CV_32FC1);
	Mat Gaussian_image;
	//高斯滤波
	GaussianBlur(image, Gaussian_image, Size(5, 5), 1, 0);
	//Gaussian_image.convertTo(Gaussian_image, CV_32FC1);
	Mat result = image - Gaussian_image;
	//获取图像高宽
	int rows = result.rows;
	int cols = result.cols;
	Mat adapt_image = Mat::zeros(result.size(), CV_8UC1);
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j <cols; j++)
		{
			if (result.at<float>(i, j) >= 0)
				adapt_image.at<uchar>(i, j) = 255;
		}
	}
	return adapt_image;
};
//错误在于at遍历像素越界的问题,注意行和列的位置大小
// CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
int main()
{
	Mat img, src, dst;
	img = imread("D:/testimage/number.jpg",IMREAD_GRAYSCALE);
	//cvtColor(img, src, COLOR_BGR2GRAY);
	dst=adaptthreshold(img);
	imshow("adapt image", dst);
	imwrite("D:/testimage/result number.jpg",dst);
	waitKey(0);
	return 0;
};

结果:OpenCV-自适应阈值分割_第1张图片
自适应阈值分割:OpenCV-自适应阈值分割_第2张图片Python:

import cv2 as cv
import numpy as np

def adaptthreshold(image):
    #对灰度图像进行高斯滤波操作
    Gaussian_image=cv.GaussianBlur(image,(3,3),1)
    #将灰度图像与滤波图像相减
    result=Gaussian_image-image
    #判断,进行阈值分割
    result[result>0]=255
    result[result<0]=0
    result=result.astype(np.uint8)
    return result



if __name__=="__main__":
    img=cv.imread("D:/testimage/number.jpg")
    gray_dst = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    adapt_image=adaptthreshold(gray_dst)
    cv.imshow("gray dst",gray_dst)
    cv.imshow("adapt image", adapt_image)
    cv.imwrite("D:/testimage/result-number.jpg",adapt_image)
    cv.waitKey(0)
    cv.destroyAllWindows()

你可能感兴趣的:(OpenCV基础教程)