adaptive Schwelle anzuwenden Ich versuche, adaptive Schwellwertbildung zu einem Bild eines A4-Papier anwenden, wie unten gezeigt:OpenCV - Wie ein Bild auf iOS
ich den Code verwenden, unter die anzuwenden Bildmanipulation:
+ (UIImage *)processImageWithOpenCV:(UIImage*)inputImage {
cv::Mat cvImage = [inputImage CVMat];
cv::Mat res;
cv::cvtColor(cvImage, cvImage, CV_RGB2GRAY);
cvImage.convertTo(cvImage,CV_32FC1,1.0/255.0);
CalcBlockMeanVariance(cvImage,res);
res=1.0-res;
res=cvImage+res;
cv::threshold(res,res, 0.85, 1, cv::THRESH_BINARY);
cv::resize(res, res, cv::Size(res.cols/2,res.rows/2));
return [UIImage imageWithCVMat:cvImage];
}
void CalcBlockMeanVariance(cv::Mat Img,cv::Mat Res,float blockSide=13) // blockSide - the parameter (set greater for larger font on image)
{
cv::Mat I;
Img.convertTo(I,CV_32FC1);
Res=cv::Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
cv::Mat inpaintmask;
cv::Mat patch;
cv::Mat smallImg;
cv::Scalar m,s;
for(int i=0;i<Img.rows-blockSide;i+=blockSide)
{
for (int j=0;j<Img.cols-blockSide;j+=blockSide)
{
patch=I(cv::Rect(j,i,blockSide,blockSide));
cv::meanStdDev(patch,m,s);
if(s[0]>0.01) // Thresholding parameter (set smaller for lower contrast image)
{
Res.at<float>(i/blockSide,j/blockSide)=m[0];
}else
{
Res.at<float>(i/blockSide,j/blockSide)=0;
}
}
}
cv::resize(I,smallImg,Res.size());
cv::threshold(Res,inpaintmask,0.02,1.0,cv::THRESH_BINARY);
cv::Mat inpainted;
smallImg.convertTo(smallImg,CV_8UC1,255);
inpaintmask.convertTo(inpaintmask,CV_8UC1);
inpaint(smallImg, inpaintmask, inpainted, 5, cv::INPAINT_TELEA);
cv::resize(inpainted,Res,Img.size());
Res.convertTo(Res,CV_8UC3);
}
Obwohl die eingegebenen Bildgraustufen wird, gibt sie ein gelbliches Bild wie unten gezeigt:
Meine Hypothese ist, dass während der Konvertierung zwischen cv :: Mat und UIImage etwas passiert ist, was zum Farbbild geführt hat, aber ich kann nicht herausfinden, wie ich dieses Problem beheben kann.
** Bitte ignorieren Sie die Statusleiste, da diese Bilder Screenshots der iOS App sind.
Update: Ich habe versucht, mit CV_8UC1
statt CV_8UC3
für Res.convertTo()
und hinzugefügt cvtColor(Res, Res, CV_GRAY2BGR);
aber bin immer noch sehr ähnliche Ergebnisse.
Könnte es die Konvertierung zwischen cv :: mat und UIImage sein, die dieses Problem verursacht?
Ich möchte mein Bild wie folgt aussehen.
Sie initialisiert haben 'Res' als' CV_32FC1', und dann konvertieren Sie es zu 'uchar' mit' Res.convertTo (Res, CV_8UC3); ', das scheint fischig zu sein, versuchen Sie es mit 'Res.convertTo (Res, CV_8UC1);' und später verwenden Sie 'cvtColor' – ZdaR
@ZdaR Können Sie bitte erläutern, was Sie mit' cvtColor' meinen? Ich habe 'CV_8UC1' gefolgt von 'cvtColor (Res, Res, CV_GRAY2BGR);' versucht. Ich bekomme jedoch immer noch sehr ähnliche Ergebnisse. Irgendwelche anderen Vorschläge? –