我在执行我试图从这里使用代码:http://rnd.azoft.com/algorithm-identifying-barely-legible-embossed-text-image/ 效果也较好,但还不够...... 我发现很难找到合适的PARAMS纹理卡。
(void)processingByStrokesMethod:(cv::Mat)src dst:(cv::Mat*)dst {
cv::Mat tmp;
cv::GaussianBlur(src, tmp, cv::Size(3,3), 2.0); // gaussian blur
tmp = cv::abs(src - tmp); // matrix of differences between source image and blur iamge
//Binarization:
cv::threshold(tmp, tmp, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
//Using method of strokes:
int Wout = 12;
int Win = Wout/2;
int startXY = Win;
int endY = src.rows - Win;
int endX = src.cols - Win;
for (int j = startXY; j < endY; j++) {
for (int i = startXY; i < endX; i++) {
//Only edge pixels:
if (tmp.at<unsigned char="">(j,i) == 255)
{
//Calculating maxP and minP within Win-region:
unsigned char minP = src.at<unsigned char="">(j,i);
unsigned char maxP = src.at<unsigned char="">(j,i);
int offsetInWin = Win/2;
for (int m = - offsetInWin; m < offsetInWin; m++) {
for (int n = - offsetInWin; n < offsetInWin; n++) {
if (src.at<unsigned char="">(j+m,i+n) < minP) {
minP = src.at<unsigned char="">(j+m,i+n);
}else if (src.at<unsigned char="">(j+m,i+n) > maxP) {
maxP = src.at<unsigned char="">(j+m,i+n);
}
}
}
//Voiting:
unsigned char meanP = lroundf((minP+maxP)/2.0);
for (int l = -Win; l < Win; l++) {
for (int k = -Win; k < Win; k++) {
if (src.at<unsigned char="">(j+l,i+k) >= meanP) {
dst->at<unsigned char="">(j+l,i+k)++;
}
}
}
}
}
}
///// Normalization of imageOut:
unsigned char maxValue = dst->at<unsigned char="">(0,0);
for (int j = 0; j < dst->rows; j++) { //finding max value of imageOut
for (int i = 0; i < dst->cols; i++) {
if (dst->at<unsigned char="">(j,i) > maxValue)
maxValue = dst->at<unsigned char="">(j,i);
}
}
float knorm = 255.0/maxValue;
for (int j = 0; j < dst->rows; j++) { //normalization of imageOut
for (int i = 0; i < dst->cols; i++) {
dst->at<unsigned char="">(j,i) = lroundf(dst->at<unsigned char="">(j,i)*knorm);
}
}
由于对比度如此之小,我会尝试边缘检测,就像您提到的那样。 – 2012-02-22 23:40:50