{"action":"created","issue":{"url":"https://api.github.com/repos/scikit-image/scikit-image/issues/1833","labels_url":"https://api.github.com/repos/scikit-image/scikit-image/issues/1833/labels{/name}","comments_url":"https://api.github.com/repos/scikit-image/scikit-image/issues/1833/comments","events_url":"https://api.github.com/repos/scikit-image/scikit-image/issues/1833/events","html_url":"https://github.com/scikit-image/scikit-image/pull/1833","id":123117662,"number":1833,"title":"Implements wavelet denoising","user":{"login":"scottsievert","id":1320475,"avatar_url":"https://avatars.githubusercontent.com/u/1320475?v=3","gravatar_id":"","url":"https://api.github.com/users/scottsievert","html_url":"https://github.com/scottsievert","followers_url":"https://api.github.com/users/scottsievert/followers","following_url":"https://api.github.com/users/scottsievert/following{/other_user}","gists_url":"https://api.github.com/users/scottsievert/gists{/gist_id}","starred_url":"https://api.github.com/users/scottsievert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scottsievert/subscriptions","organizations_url":"https://api.github.com/users/scottsievert/orgs","repos_url":"https://api.github.com/users/scottsievert/repos","events_url":"https://api.github.com/users/scottsievert/events{/privacy}","received_events_url":"https://api.github.com/users/scottsievert/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/scikit-image/scikit-image/labels/enhancement","name":"enhancement","color":"51af3c"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":21,"created_at":"2015-12-20T00:06:31Z","updated_at":"2016-01-31T18:39:47Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/scikit-image/scikit-image/pulls/1833","html_url":"https://github.com/scikit-image/scikit-image/pull/1833","diff_url":"https://github.com/scikit-image/scikit-image/pull/1833.diff","patch_url":"https://github.com/scikit-image/scikit-image/pull/1833.patch"},"body":"This pull request implements wavelet denoising (as mentioned in issue #602). This pull request uses [PyWavelets] to implement this.\r\n\r\nRunning the example in docstring yields the following results:\r\n\r\n![figure_1](https://cloud.githubusercontent.com/assets/1320475/11915679/dbabbc70-a677-11e5-9b52-bda49faa2512.png)\r\n\r\n### Code changes\r\n* added `denoise_wavelet` in `_denoise.py`\r\n* added PyWavelets to `optional_requirements.txt`.\r\n\r\n### Unsure about\r\n* clipping. Wavelet denoising may result in values that are beyond the max/min of normal images. A keyword argument for this has been added that clips between 0/1 for the skimage workflow -- is that the right approach?\r\n* sizing. There are cases where `pywt.threshold` returns an array of different size than the input (e.g., in my testing, for odd sized arrays when using `db2`). Currently, the code enforces that the output should be the same size as the image -- is that the right approach?\r\n* documentation formatting. I tried building the docs (typing `make` in `docs/`) but couldn't find any function definitions.\r\n* tests. How should tests be implemented for this?\r\n\r\n[PyWavelets]:http://pywavelets.readthedocs.org/en/latest/\r\n\r\nEDIT: Todo's, using PR #1804 as an example\r\n- [ ] add tests to cover 100% of code\r\n- [ ] add example to gallery\r\n- [ ] add reference to `CONTRIBUTORS.txt` (final step to avoid merge conflicts)\r\n\r\n@grlee77 also had useful points:\r\n- [ ] generalize to n dimensional wavelet transforms (not doing it on each color plane)\r\n- [ ] automatically choose threshold?"},"comment":{"url":"https://api.github.com/repos/scikit-image/scikit-image/issues/comments/177578206","html_url":"https://github.com/scikit-image/scikit-image/pull/1833#issuecomment-177578206","issue_url":"https://api.github.com/repos/scikit-image/scikit-image/issues/1833","id":177578206,"user":{"login":"scottsievert","id":1320475,"avatar_url":"https://avatars.githubusercontent.com/u/1320475?v=3","gravatar_id":"","url":"https://api.github.com/users/scottsievert","html_url":"https://github.com/scottsievert","followers_url":"https://api.github.com/users/scottsievert/followers","following_url":"https://api.github.com/users/scottsievert/following{/other_user}","gists_url":"https://api.github.com/users/scottsievert/gists{/gist_id}","starred_url":"https://api.github.com/users/scottsievert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scottsievert/subscriptions","organizations_url":"https://api.github.com/users/scottsievert/orgs","repos_url":"https://api.github.com/users/scottsievert/repos","events_url":"https://api.github.com/users/scottsievert/events{/privacy}","received_events_url":"https://api.github.com/users/scottsievert/received_events","type":"User","site_admin":false},"created_at":"2016-01-31T18:39:47Z","updated_at":"2016-01-31T18:39:47Z","body":"There are other open PRs (#1837, #1838) that this PR depends on. How should I handle this?"}}