#include <processor.h>
Inheritance diagram for EMAN::WatershedProcessor:
Public Member Functions | |
virtual void | process_inplace (EMData *image) |
To process an image in-place. | |
virtual string | get_name () const |
Get the processor's name. | |
virtual string | get_desc () const |
Get the descrition of this specific processor. | |
virtual TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
Static Public Member Functions | |
Processor * | NEW () |
Static Public Attributes | |
const string | NAME = "segment.watershed" |
Private Member Functions | |
vector< Vec3i > | watershed (EMData *mask, EMData *image, const float &threshold, const Vec3i &cordinate, const int mask_value) |
vector< Vec3i > | find_region (EMData *mask, const vector< Vec3i > &coords, const int mask_value, vector< Vec3i > ®ion) |
xpoints | x coordinates | |
ypoints | y coordinates | |
zpoints | z coordinates | |
minval | min value |
Definition at line 5492 of file processor.h.
|
Definition at line 1453 of file processor.cpp. References EMAN::EMData::get_value_at(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), and EMAN::Vec3i. Referenced by process_inplace(). 01454 { 01455 static vector<Vec3i> two_six_connected; 01456 if (two_six_connected.size() == 0) { 01457 for(int i = -1; i <= 1; ++i) { 01458 for(int j = -1; j <= 1; ++j) { 01459 for(int k = -1; k <= 1; ++k) { 01460 if ( j != 0 || i != 0 || k != 0) { 01461 two_six_connected.push_back(Vec3i(i,j,k)); 01462 } 01463 } 01464 } 01465 } 01466 } 01467 01468 vector<Vec3i> ret; 01469 for(vector<Vec3i>::const_iterator it = two_six_connected.begin(); it != two_six_connected.end(); ++it ) { 01470 for(vector<Vec3i>::const_iterator it2 = coords.begin(); it2 != coords.end(); ++it2 ) { 01471 if (mask->get_value_at((*it2)[0],(*it2)[1],(*it2)[2]) != mask_value) throw; 01472 Vec3i c = (*it)+(*it2); 01473 01474 if ( c[0] < 0 || c[0] >= mask->get_xsize()) continue; 01475 if ( c[1] < 0 || c[1] >= mask->get_ysize()) continue; 01476 if ( c[2] < 0 || c[2] >= mask->get_zsize()) continue; 01477 01478 if( mask->get_value_at(c[0],c[1],c[2]) == mask_value ) { 01479 if (find(ret.begin(),ret.end(),c) == ret.end()) { 01480 if (find(region.begin(),region.end(),c) == region.end()) { 01481 region.push_back(c); 01482 ret.push_back(c); 01483 } 01484 } 01485 } 01486 } 01487 } 01488 return ret; 01489 }
|
|
Get the descrition of this specific processor. This function must be overwritten by a subclass.
Implements EMAN::Processor. Definition at line 5507 of file processor.h. 05508 { 05509 return "Does a watershed"; 05510 }
|
|
Get the processor's name. Each processor is identified by a unique name.
Implements EMAN::Processor. Definition at line 5497 of file processor.h. 05498 {
05499 return NAME;
05500 }
|
|
Get processor parameter information in a dictionary. Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.
Reimplemented from EMAN::Processor. Definition at line 5512 of file processor.h. References EMAN::TypeDict::put(). 05513 { 05514 TypeDict d; 05515 d.put("xpoints", EMObject::FLOATARRAY,"x coordinates"); 05516 d.put("ypoints", EMObject::FLOATARRAY,"y coordinates"); 05517 d.put("zpoints", EMObject::FLOATARRAY,"z coordinates"); 05518 d.put("minval", EMObject::FLOAT,"min value"); 05519 return d; 05520 }
|
|
Definition at line 5502 of file processor.h. 05503 { 05504 return new WatershedProcessor(); 05505 }
|
|
To process an image in-place. For those processors which can only be processed out-of-place, override this function to just print out some error message to remind user call the out-of-place version.
Implements EMAN::Processor. Definition at line 1378 of file processor.cpp. References copy(), find_region(), EMAN::EMData::get_data(), EMAN::EMData::get_size(), EMAN::EMData::set_value_at(), EMAN::EMData::to_zero(), EMAN::EMData::update(), v, EMAN::Vec3i, watershed(), EMAN::EMData::write_image(), x, and y. 01378 { 01379 vector<float> xpoints = params["xpoints"]; 01380 vector<float> ypoints = params["ypoints"]; 01381 vector<float> zpoints = params["zpoints"]; 01382 01383 vector<int> x(xpoints.begin(),xpoints.end()); 01384 vector<int> y(ypoints.begin(),ypoints.end()); 01385 vector<int> z(zpoints.begin(),zpoints.end()); 01386 01387 01388 // throw if vector lengths are unequal 01389 01390 // float maxval = -99999; 01391 /* 01392 for(unsigned int i = 0; i < xpoints.size(); ++i) { 01393 float val = image->get_value_at(x[i],y[i],z[i]); 01394 if (val > maxval) { 01395 maxval = val; 01396 } 01397 }*/ 01398 01399 float minval = params["minval"]; 01400 01401 EMData* mask = new EMData(*image); 01402 mask->to_zero(); 01403 01404 // Set the original mask values 01405 for(unsigned int i = 0; i < xpoints.size(); ++i) { 01406 try { 01407 mask->set_value_at(x[i],y[i],z[i], (float)(i+1)); 01408 } catch (...) { 01409 continue; 01410 } 01411 } 01412 mask->write_image("seeds2.mrc"); 01413 // int dis = 500; 01414 // float dx = (maxval-minval)/((float) dis - 1); 01415 01416 01417 // for(int i = 0; i < dis; ++i) { 01418 // float val = maxval-i*dx; 01419 01420 while( true ) { 01421 bool cont= false; 01422 for(unsigned int j = 0; j < xpoints.size(); ++j) 01423 { 01424 01425 Vec3i coord(x[j],y[j],z[j]); 01426 vector<Vec3i> region; 01427 region.push_back(coord); 01428 vector<Vec3i> find_region_input = region; 01429 while (true) { 01430 vector<Vec3i> v = find_region(mask,find_region_input, j+1, region); 01431 if (v.size() == 0 ) break; 01432 else find_region_input = v; 01433 } 01434 01435 vector<Vec3i> tmp(region.begin(),region.end()); 01436 region.clear(); 01437 for(vector<Vec3i>::const_iterator it = tmp.begin(); it != tmp.end(); ++it ) { 01438 vector<Vec3i> tmp2 = watershed(mask, image, minval, *it, j+1); 01439 copy(tmp2.begin(),tmp2.end(),back_inserter(region)); 01440 } 01441 if (region.size() != 0) cont = true; 01442 } 01443 01444 if (!cont) break; 01445 } 01446 // } 01447 01448 memcpy(image->get_data(),mask->get_data(),sizeof(float)*image->get_size()); 01449 image->update(); 01450 }
|
|
Definition at line 1491 of file processor.cpp. References EMAN::EMData::get_value_at(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::EMData::set_value_at(), and EMAN::Vec3i. Referenced by process_inplace(). 01492 { 01493 static vector<Vec3i> two_six_connected; 01494 if (two_six_connected.size() == 0) { 01495 for(int i = -1; i <= 1; ++i) { 01496 for(int j = -1; j <= 1; ++j) { 01497 for(int k = -1; k <= 1; ++k) { 01498 if ( j != 0 || i != 0 || k != 0) { 01499 two_six_connected.push_back(Vec3i(i,j,k)); 01500 } 01501 } 01502 } 01503 } 01504 } 01505 01506 if (mask->get_value_at(coordinate[0],coordinate[1],coordinate[2]) != mask_value) throw; 01507 01508 vector<Vec3i> ret; 01509 for(vector<Vec3i>::const_iterator it = two_six_connected.begin(); it != two_six_connected.end(); ++it ) { 01510 Vec3i c = (*it)+coordinate; 01511 01512 if ( c[0] < 0 || c[0] >= image->get_xsize()) continue; 01513 if ( c[1] < 0 || c[1] >= image->get_ysize()) continue; 01514 if ( c[2] < 0 || c[2] >= image->get_zsize()) continue; 01515 01516 // cout << image->get_value_at(c[0],c[1],c[2] ) << " " << threshold << endl; 01517 if( image->get_value_at(c[0],c[1],c[2]) != 0 && (mask->get_value_at(c[0],c[1],c[2]) == 0 )) { 01518 //cout << "Added something " << mask_value << endl; 01519 mask->set_value_at(c[0],c[1],c[2], (float)mask_value); 01520 ret.push_back(c); 01521 } 01522 } 01523 return ret; 01524 }
|
|
Definition at line 84 of file processor.cpp. |