मैं एक A4 कागज की एक छवि के लिए अनुकूली थ्रेशोल्डिंग लागू करने के लिए कोशिश कर रहा हूँ पर एक छवि के लिए अनुकूली सीमा लागू करने के लिए:OpenCV - नीचे दिखाया गया है कैसे आईओएस
मैं लागू करने के लिए नीचे दिए गए कोड का उपयोग छवि हेरफेर:
+ (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);
}
हालांकि inputted छवि greyscaled है, यह एक पीले रंग छवि के रूप में नीचे दिखाया गया है आउटपुट:
मेरी परिकल्पना यह है कि सीवी :: मैट और यूआईएममेज के बीच रूपांतरण, कुछ रंग छवि की ओर अग्रसर हुआ, हालांकि मैं इस मुद्दे को ठीक करने का तरीका नहीं समझ सकता।
** कृपया स्टेटस बार को अनदेखा करें क्योंकि ये छवियां आईओएस ऐप के स्क्रीनशॉट हैं।
अद्यतन: मैं Res.convertTo()
के लिए CV_8UC1
बजाय CV_8UC3
उपयोग करने की कोशिश और cvtColor(Res, Res, CV_GRAY2BGR);
जोड़ा है, लेकिन अभी भी बहुत इसी तरह के परिणाम हो रही है है।
क्या यह सीवी :: मैट और यूआईएममेज के बीच रूपांतरण हो सकता है जो इस समस्या का कारण बन रहा है ??
मैं चाहता हूं कि मेरी छवि नीचे दिखाए गए जैसा हो।
आप '' CV_32FC1' रूप Res' प्रारंभ है उत्पादन की जाँच करें, और के लिए काम तो आप 'Res.convertTo (रेस, CV_8UC3) का उपयोग कर uchar'' करने के लिए इसे परिवर्तित कर रहे हैं; ', जो फिश लग रहा है, 'Res.convertTo (Res, CV_8UC1) के साथ प्रयास करें;' और बाद में 'cvtColor' – ZdaR
@ZdaR का उपयोग करें, क्या आप कृपया' cvtColor' 'का उपयोग करके इसका अर्थ बता सकते हैं? मैंने 'सीवी_8 यूसी 1 'की कोशिश की है जिसके बाद' सीवीटीकॉलर (रेस, रेस, सीवी_जीआरई 2 बीजीआर); '। हालांकि, मुझे अभी भी बहुत ही समान परिणाम मिल रहे हैं। कोई अन्य सुझाव? –