#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. |
1.3.9.1