#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 = "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 5454 of file processor.h.
|
||||||||||||||||||||
|
Definition at line 1425 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(). 01426 {
01427 static vector<Vec3i> two_six_connected;
01428 if (two_six_connected.size() == 0) {
01429 for(int i = -1; i <= 1; ++i) {
01430 for(int j = -1; j <= 1; ++j) {
01431 for(int k = -1; k <= 1; ++k) {
01432 if ( j != 0 || i != 0 || k != 0) {
01433 two_six_connected.push_back(Vec3i(i,j,k));
01434 }
01435 }
01436 }
01437 }
01438 }
01439
01440 vector<Vec3i> ret;
01441 for(vector<Vec3i>::const_iterator it = two_six_connected.begin(); it != two_six_connected.end(); ++it ) {
01442 for(vector<Vec3i>::const_iterator it2 = coords.begin(); it2 != coords.end(); ++it2 ) {
01443 if (mask->get_value_at((*it2)[0],(*it2)[1],(*it2)[2]) != mask_value) throw;
01444 Vec3i c = (*it)+(*it2);
01445
01446 if ( c[0] < 0 || c[0] >= mask->get_xsize()) continue;
01447 if ( c[1] < 0 || c[1] >= mask->get_ysize()) continue;
01448 if ( c[2] < 0 || c[2] >= mask->get_zsize()) continue;
01449
01450 if( mask->get_value_at(c[0],c[1],c[2]) == mask_value ) {
01451 if (find(ret.begin(),ret.end(),c) == ret.end()) {
01452 if (find(region.begin(),region.end(),c) == region.end()) {
01453 region.push_back(c);
01454 ret.push_back(c);
01455 }
01456 }
01457 }
01458 }
01459 }
01460 return ret;
01461 }
|
|
|
Get the descrition of this specific processor. This function must be overwritten by a subclass.
Implements EMAN::Processor. Definition at line 5469 of file processor.h. 05470 {
05471 return "Does a watershed";
05472 }
|
|
|
Get the processor's name. Each processor is identified by a unique name.
Implements EMAN::Processor. Definition at line 5459 of file processor.h. 05460 {
05461 return NAME;
05462 }
|
|
|
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 5474 of file processor.h. References EMAN::TypeDict::put(). 05475 {
05476 TypeDict d;
05477 d.put("xpoints", EMObject::FLOATARRAY,"x coordinates");
05478 d.put("ypoints", EMObject::FLOATARRAY,"y coordinates");
05479 d.put("zpoints", EMObject::FLOATARRAY,"z coordinates");
05480 d.put("minval", EMObject::FLOAT,"min value");
05481 return d;
05482 }
|
|
|
Definition at line 5464 of file processor.h. 05465 {
05466 return new WatershedProcessor();
05467 }
|
|
|
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 1350 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. 01350 {
01351 vector<float> xpoints = params["xpoints"];
01352 vector<float> ypoints = params["ypoints"];
01353 vector<float> zpoints = params["zpoints"];
01354
01355 vector<int> x(xpoints.begin(),xpoints.end());
01356 vector<int> y(ypoints.begin(),ypoints.end());
01357 vector<int> z(zpoints.begin(),zpoints.end());
01358
01359
01360 // throw if vector lengths are unequal
01361
01362 // float maxval = -99999;
01363 /*
01364 for(unsigned int i = 0; i < xpoints.size(); ++i) {
01365 float val = image->get_value_at(x[i],y[i],z[i]);
01366 if (val > maxval) {
01367 maxval = val;
01368 }
01369 }*/
01370
01371 float minval = params["minval"];
01372
01373 EMData* mask = new EMData(*image);
01374 mask->to_zero();
01375
01376 // Set the original mask values
01377 for(unsigned int i = 0; i < xpoints.size(); ++i) {
01378 try {
01379 mask->set_value_at(x[i],y[i],z[i], (float)(i+1));
01380 } catch (...) {
01381 continue;
01382 }
01383 }
01384 mask->write_image("seeds2.mrc");
01385 // int dis = 500;
01386 // float dx = (maxval-minval)/((float) dis - 1);
01387
01388
01389 // for(int i = 0; i < dis; ++i) {
01390 // float val = maxval-i*dx;
01391
01392 while( true ) {
01393 bool cont= false;
01394 for(unsigned int j = 0; j < xpoints.size(); ++j)
01395 {
01396
01397 Vec3i coord(x[j],y[j],z[j]);
01398 vector<Vec3i> region;
01399 region.push_back(coord);
01400 vector<Vec3i> find_region_input = region;
01401 while (true) {
01402 vector<Vec3i> v = find_region(mask,find_region_input, j+1, region);
01403 if (v.size() == 0 ) break;
01404 else find_region_input = v;
01405 }
01406
01407 vector<Vec3i> tmp(region.begin(),region.end());
01408 region.clear();
01409 for(vector<Vec3i>::const_iterator it = tmp.begin(); it != tmp.end(); ++it ) {
01410 vector<Vec3i> tmp2 = watershed(mask, image, minval, *it, j+1);
01411 copy(tmp2.begin(),tmp2.end(),back_inserter(region));
01412 }
01413 if (region.size() != 0) cont = true;
01414 }
01415
01416 if (!cont) break;
01417 }
01418 // }
01419
01420 memcpy(image->get_data(),mask->get_data(),sizeof(float)*image->get_size());
01421 image->update();
01422 }
|
|
||||||||||||||||||||||||
|
Definition at line 1463 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(). 01464 {
01465 static vector<Vec3i> two_six_connected;
01466 if (two_six_connected.size() == 0) {
01467 for(int i = -1; i <= 1; ++i) {
01468 for(int j = -1; j <= 1; ++j) {
01469 for(int k = -1; k <= 1; ++k) {
01470 if ( j != 0 || i != 0 || k != 0) {
01471 two_six_connected.push_back(Vec3i(i,j,k));
01472 }
01473 }
01474 }
01475 }
01476 }
01477
01478 if (mask->get_value_at(coordinate[0],coordinate[1],coordinate[2]) != mask_value) throw;
01479
01480 vector<Vec3i> ret;
01481 for(vector<Vec3i>::const_iterator it = two_six_connected.begin(); it != two_six_connected.end(); ++it ) {
01482 Vec3i c = (*it)+coordinate;
01483
01484 if ( c[0] < 0 || c[0] >= image->get_xsize()) continue;
01485 if ( c[1] < 0 || c[1] >= image->get_ysize()) continue;
01486 if ( c[2] < 0 || c[2] >= image->get_zsize()) continue;
01487
01488 // cout << image->get_value_at(c[0],c[1],c[2] ) << " " << threshold << endl;
01489 if( image->get_value_at(c[0],c[1],c[2]) != 0 && (mask->get_value_at(c[0],c[1],c[2]) == 0 )) {
01490 //cout << "Added something " << mask_value << endl;
01491 mask->set_value_at(c[0],c[1],c[2], (float)mask_value);
01492 ret.push_back(c);
01493 }
01494 }
01495 return ret;
01496 }
|
|
|
Definition at line 181 of file processor.cpp. |
1.3.9.1