#include<iostream>
#include<opencv.hpp>
using namespace cv;
using namespace std;
/*
对输入图像作移动平均分割
src为单通道灰度图像
num表示计算平均的点数
*/
void movingThreshold(Mat Img, Mat Img1, int num)
{
IplImage* src= &IplImage(Img);
IplImage* dst= &IplImage(Img1);
assert(src->nChannels == 1 && dst->nChannels == 1);
assert(src->height == dst->height && src->width == dst->width);
uchar* dstdata = (uchar*)dst->imageData;
uchar* data = (uchar*)src->imageData;
int w = src->width, h = src->height;
int step = src->widthStep;
float n = (float)num;
float m_pre = data[0] / n;
float m_now = 0.0;
cout << "data[0]" << data[0] << "m_pre:" << m_pre << endl;
float b = 0.755;
cout << w << " " << step << endl;
for (int i = 0; i<h; i++)
{
for (int j = 0; j<w; j++)
{
int index = i * step + j;
float dif;
if (index<num + 1)
dif = data[index];
else
dif = data[index] - data[index - num - 1];
dif *= 1 / n;
m_now = m_pre + dif;
m_pre = m_now;
//cout << m_now << endl;
if (data[index]>cvRound(b*m_now))
dstdata[index] = 255;
else
dstdata[index] = 0;
}
}
//提升滤波
Mat temp = cvarrToMat(dst);
/*Mat dst1;*/
//Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
//morphologyEx(~temp, dst1, MORPH_CLOSE, element);
//Mat gaussi;
//GaussianBlur(~temp, gaussi, Size(11,11), 3, 3);
//Mat mask;
//cv::subtract(~temp, gaussi, mask);
//Mat imageEnhance;
//cv::add(~temp,5 * mask, imageEnhance);
//blur(imageEnhance, imageEnhance, Size(3, 3));
imwrite("11.jpg", temp);
//cvReleaseImage(&src);
//cvDestroyWindow("src");
//cvReleaseImage(&dst);
}
int main()
{
cout << "hello world" << endl;
Mat srcImage = imread("D:/Image/PDF0619/C_1.jpg",0);
//threshold(srcImage,srcImage,230,255,THRESH_TRUNC);
Mat dstImage(srcImage.rows,srcImage.cols, CV_8UC1);
movingThreshold(srcImage, dstImage,13);
waitKey(0);
return 0;
}
移动平均阈值分割
最新推荐文章于 2022-04-30 08:00:00 发布