mercoledì 12 marzo 2014

Visione Artificiale - Lab 2: threshold, adaptiveThreshold, Otsu e Filtering

#include <opencv2\opencv.hpp>


using namespace cv;

int main(){
Mat3b a = imread("../images/Chris_Sharma.jpg", 1);
Mat1b b;
//Funzione RGB -> livelli di grigio
cvtColor(a, b, CV_RGB2GRAY);
imshow("Originale", a);
imshow("Grigio", b);

//Soglia fatta a mano
Mat1b out(b.size());
int th = 120;
for(int r=0;r<b.rows;++r){
for(int c=0;c<b.cols;++c){
if(b(r,c)>th)
out(r,c) = 255;
else
out(r,c) = 0;
}
}
imshow("Mia soglia", out);

//soglia OpenCV, non è necessario inizializzare matrice di output; 0 soglia binaria
Mat1b out1;
threshold(b, out1, th, 255, 0);
imshow("Soglia OpenCV", out1);

//soglia di Otsu automatica; valore th non serve
Mat1b out2;
threshold(b, out2, th, 255, THRESH_OTSU);
imshow("Soglia di Otsu", out2);

//Otsu non funziona bene con illuminazione non omogenea
Mat1b foglio = imread("../images/Immagini/son1.png", 0);
Mat1b out3;
Mat1b out3bis;
threshold(foglio, out3, th, 255, 0);
threshold(foglio, out3bis, th, 255, THRESH_OTSU);
imshow("Soglia OpenCV", out3);
imshow("Soglia Otsu", out3bis);

//soglia adattativa, la maschera deve avere dimensione dispari perchè un pixel è centrato
Mat1b out4;
adaptiveThreshold(foglio, out4, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 7, 5);
imshow("Soglia adattativa", out4);

//Filtering
Mat1f out5(b.rows, b.cols, float(0));
int raggio = 1;
Mat1f kernel(2*raggio+1, 2*raggio+1, 1./9.);
//Mat1f kernel = (Mat1f(3,3) << -1, -1, -1, -1, 8, -1, -1, -1, -1);

for(int r=raggio;r<b.rows-raggio;++r){
for(int c=raggio;c<b.cols-raggio;++c){
for(int i=-raggio;i<=raggio;++i){
for(int j=-raggio;j<=raggio;++j){
out5(r,c) = out5(r,c) + (b(r+i,c+j)*kernel(raggio+i,raggio+j));
}
}
}
}
normalize(out5, out5, 1.0, 0.0, NORM_MINMAX);
imshow("Filtro", out5);

waitKey();
}

Nessun commento:

Posta un commento