From 3ec8ee48e294d4e4cdceb9a06573a429c0c24e81 Mon Sep 17 00:00:00 2001 From: Sad-Abd Date: Thu, 6 Jul 2023 23:38:34 +0330 Subject: [PATCH] Add README and logo, update gitignore for .vscode --- .gitignore | 3 + README.md | 239 ++++++++++++++++++++++++++++++++++++++++++++++++ images/logo.png | Bin 0 -> 25243 bytes 3 files changed, 242 insertions(+) create mode 100644 images/logo.png diff --git a/.gitignore b/.gitignore index 6769e21..48988c9 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,9 @@ venv.bak/ .spyderproject .spyproject +# vscode folder +.vscode + # Rope project settings .ropeproject diff --git a/README.md b/README.md index e69de29..c122176 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,239 @@ + + + + +[![Contributors][contributors-shield]][contributors-url] +[![Forks][forks-shield]][forks-url] +[![Stargazers][stars-shield]][stars-url] +[![Issues][issues-shield]][issues-url] +[![MIT License][license-shield]][license-url] +[![LinkedIn][linkedin-shield]][linkedin-url] +[![Made with love in SUT (Iran)][sut-badge]][sut-add] + + + +
+
+ + Logo + + +

QTREEMESH

+ +

+ Generation of QuadTree mesh from an image +
+ Explore the docs » +
+
+ View Demo + · + Report Bug + · + Request Feature +

+
+ + + + +
+ Table of Contents +
    +
  1. + About The Project + +
  2. +
  3. + Getting Started + +
  4. +
  5. Usage
  6. +
  7. Roadmap
  8. +
  9. Contributing
  10. +
  11. License
  12. +
  13. Contact
  14. +
  15. Acknowledgments
  16. +
+
+ + + + +## About The Project + + + +QTREEMESH is a python package that can create a [Quadtree](https://en.wikipedia.org/wiki/Quadtree) structure from an image. This tree data structure can also be converted to mesh structure that can be used in different areas of science, e.g. finite element analysis. The Quadtree algorithm in this package is based on pixels' intensity. + +

(back to top)

+ + + +### Built With + +[![python][python]](https://www.python.org) + +

(back to top)

+ + + + +## Getting Started + +This part explains how to install and use this package. + +### Installation +Install `QTREEMESH` from PyPI via pip. +```sh +pip install qtreemesh +``` + + +

(back to top)

+ + + + +## Usage + +There is a `test.py` file in `examples` folder that demonstrate how different parts of this package work. Here we go through this file line by line: + +### 1. Read image + +First we import required tools from other libraries +```python +from PIL import Image # to read image file properly +from numpy import asarray # for converting image matrix to array +``` + +Then we read the image and convert it to gray-scale. There are three example images in `examples` folder. `4.jpg` is smaller than the two others and need fewer computation efforts. +```python +im = Image.open("4.jpg").convert('L') +``` + +### 2. Preprocessing + +In order to implement QuadTree algorithm, the image should be square and the number of pixels in each dimension should be of order $2^n$ (*more explanation to be added*). There is a function `image_preprocess` dedicated to this modification of original image: +```python +from qmeshtree import image_preprocess + +imar = image_preprocess(asarray(im)) +``` + +### 3. QuadTree Algorithm + +The QuadTree decomposition can be performed on `image_array` using a recursive class `QTree` based on given `tolerance`. +```python +from qmeshtree import QTree + +quad = QTree(None, imar, 125) # QTree(None, image_array, tolerance) +``` + +`QTree` object may have 4 children `QTree` objects (can be accessed through attributes: `north_west`, +`north_east`, +`south_west`, +`south_east`) and so on. Each `QTree` has an attribute `divided` that determines the existence of children partitions. There are also an property method for counting `count_leaves` and a method for saving tree leaves `save_leaves` (i.e. undivided partitions). + +### 4. Mesh Generation +Common mesh data structure can be extracted from QuadTree structure using `QTreeMesh` class. After initiating the class, corresponding `elements` and `nodes` can be generated as attributes of the `QTreeMesh` object with the method `create_elements`. The resulted mesh may be illustrated using `draw` method. +```python +from qmeshtree import QTreeMesh + +mesh = QTreeMesh(quad) +mesh.create_elements() +mesh.draw(True, 'orangered') # mesh.draw(fill_inside, edge_color, save_name) +``` + +Each element in `elements` is a `QTreeElement` object that contains many attributes, e.g. element number : `number`, element nodes : `nodes_numbers`, element property (average of pixel intensities) : `element_property` and etc. + + + +_For more examples, please refer to the [Documentation](https://example.com)_ + +

(back to top)

+ + + + +## Roadmap + +- [ ] Completing the codes documentation +- [ ] Adding details to README file +- [ ] Exporting data as `vtk` format +- [ ] Prepare required data for SBFEM + + +See the [open issues](https://github.com/Sad-Abd/qtreemesh/issues) for a full list of proposed features (and known issues). + +

(back to top)

+ + + + +## Contributing + +Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. + +If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". +Don't forget to give the project a star! Thanks again! + + +

(back to top)

+ + + + +## License + +Distributed under the MIT License. See `LICENSE.txt` for more information. + +

(back to top)

+ + + + +## Contact + +Sadjad Abedi - AbediSadjad@gmail.com + +Project Link: [https://github.com/Sad-Abd/qtreemesh](https://github.com/Sad-Abd/qtreemesh) + +

(back to top)

+ + + + +## Acknowledgments + +* []() +* []() +* []() + +

(back to top)

+ + + + + +[contributors-shield]: https://img.shields.io/github/contributors/Sad-Abd/qtreemesh.svg?style=for-the-badge +[contributors-url]: https://github.com/Sad-Abd/qtreemesh/graphs/contributors +[forks-shield]: https://img.shields.io/github/forks/Sad-Abd/qtreemesh.svg?style=for-the-badge +[forks-url]: https://github.com/Sad-Abd/qtreemesh/network/members +[stars-shield]: https://img.shields.io/github/stars/Sad-Abd/qtreemesh.svg?style=for-the-badge +[stars-url]: https://github.com/Sad-Abd/qtreemesh/stargazers +[issues-shield]: https://img.shields.io/github/issues/Sad-Abd/qtreemesh.svg?style=for-the-badge +[issues-url]: https://github.com/Sad-Abd/qtreemesh/issues +[license-shield]: https://img.shields.io/github/license/Sad-Abd/qtreemesh.svg?style=for-the-badge +[license-url]: https://github.com/Sad-Abd/qtreemesh/blob/master/LICENSE.txt +[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 +[linkedin-url]: https://linkedin.com/in/seyed-sadjad-abedi-shahri +[product-screenshot]: images/screenshot.png +[python]: https://www.python.org/static/community_logos/python-logo.png +[sut-add]: https://sut.ac.ir +[sut-badge]: https://img.shields.io/badge/Made%20with%20%E2%9D%A4%EF%B8%8F%20in-SUT%20(Iran)-0c674a?style=for-the-badge diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5492d1ebde6f26d00236f4eb56d92fbb7338ac GIT binary patch literal 25243 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 literal 0 HcmV?d00001