Tout d'abord, j'ai cette image et je souhaite créer une application capable de détecter des images comme celle-ci et d'en retirer le cercle (filigrane).Suppression du filigrane d'une image à l'aide d'opencv
int main(){
Mat im1,im2,im3,gray,gray2,result;
im2=imread(" (2).jpg");
namedWindow("x",CV_WINDOW_FREERATIO);
imshow("x",im2);
//converting it to gray
cvtColor(im2,gray,CV_BGR2GRAY);
// creating a new image that will have the cropped ellipse
Mat ElipseImg(im2.rows,im2.cols,CV_8UC1,Scalar(0,0,0));
//detecting the largest circle
GaussianBlur(gray,gray,Size(5,5),0);
vector<Vec3f> circles;
HoughCircles(gray,circles,CV_HOUGH_GRADIENT,1,gray.rows/8,100,100,100,0);
uchar x;
int measure=0;int id=0;
for(int i=0;i<circles.size();i++){
if(cvRound(circles[i][2])>measure && cvRound(circles[i][2])<1000){
measure=cvRound(circles[i][2]);
id=i;
}
}
Point center(cvRound(circles[id][0]),cvRound(circles[id][1]));
int radius=cvRound(circles[id][2]);
circle(im2,center,3,Scalar(0,255,0),-1,8,0);
circle(im2,center,radius,Scalar(0,255,0),2,8,0);
ellipse(ElipseImg,center,Size(radius,radius),0,0,360,Scalar(255,255,255),-1,8);
cout<<"center: "<<center<<" radius: "<<radius<<endl;
Mat res;
bitwise_and(gray,ElipseImg,result);
namedWindow("bitwise and",CV_WINDOW_FREERATIO);
imshow("bitwise and",result);
// trying to estimate the Intensity of the circle for the thresholding
x=result.at<uchar>(cvRound(circles[id][0]+30),cvRound(circles[id][1]));
cout<<(int)x;
//thresholding the output image
threshold(ElipseImg,ElipseImg,(int)x-10,250,CV_THRESH_BINARY);
namedWindow("threshold",CV_WINDOW_FREERATIO);
imshow("threshold",ElipseImg);
// making bitwise_or
bitwise_or(gray,ElipseImg,res);
namedWindow("bitwise or",CV_WINDOW_FREERATIO);
imshow("bitwise or",res);
waitKey(0);
}
Jusqu'à présent, ce que je fait est:
- Je convertir en niveaux de gris
- Je détecte le plus grand cercle en utilisant des cercles de jarrets, puis faire un cercle avec un même rayon de une nouvelle image
- Ce nouveau cercle avec le grayscaled utilisant (
bitwise_and
) me donne une image avec seulement ce cercle - seuil nouvelle image
bitwise_or
le résultat du seuil
Mon problème est que tout texte noir sur la ligne blanche incurvée à l'intérieur de ce cercle n'a pas comparu. J'ai essayé d'enlever la couleur en utilisant les valeurs de pixel au lieu du seuil, mais le problème est le même, donc des solutions ou des suggestions?
Impressionnant, il fonctionne très bien, mais j'ai problème avec des pages plus sombres - filigrane plus sombre - il suffit de copier l'ensemble filigrane à l'image bw il est comme rien fait à la fin, comment puis-je faire face à quelque chose comme ça ? –
Vérifiez les images intermédiaires: la ** différence **, ** arrière-plan **, le ** masque de filigrane ** et le ** binaire intermédiaire **. Ici, nous utilisons la méthode Otsu, donc les images soumises au seuillage doivent être bimodales. Vous pouvez vérifier si les lettres à l'intérieur du filigrane sont segmentées comme prévu en recadrant une partie du filigrane qui contient du texte et en appliquant un seuillage Otsu. Il pourrait aussi s'agir de CV_THRESH_BINARY vs CV_THRESH_BINARY_INV. – dhanushka
@dhanushka S'il vous plaît Quelqu'un peut-il aider avec le code Java pour le vecteur Looping Part.Je ne peux pas trouver quelque chose d'équivalent en Java. J'ai posté Question ici -> http://answers.opencv.org/question/130997/how-to-parse-a-binary-image-pixel-by-pixel-in-java-open-cv/ –