步骤:1、输入原图像,并进行滤波平滑处理;2、将原图像与滤波图像做差处理;3、结果图像通过判断像素点是否大于0而进行阈值分割,也可以自行设置T的大小。
C++:
#include<opencv2/opencv.hpp>
#include<iostream>
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;
};
结果:
自适应阈值分割: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()