<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Saharsh Laud</title>
    <description>The latest articles on DEV Community by Saharsh Laud (@saharshlaud).</description>
    <link>https://dev.to/saharshlaud</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F683458%2F409482b6-974a-4c28-9323-f086000c7001.png</url>
      <title>DEV Community: Saharsh Laud</title>
      <link>https://dev.to/saharshlaud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saharshlaud"/>
    <language>en</language>
    <item>
      <title>Building Reproducible Geospatial Pipelines: A STAC Extension with DAGs</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Mon, 27 Oct 2025 06:43:29 +0000</pubDate>
      <link>https://dev.to/saharshlaud/building-reproducible-geospatial-pipelines-a-stac-extension-with-dags-1kem</link>
      <guid>https://dev.to/saharshlaud/building-reproducible-geospatial-pipelines-a-stac-extension-with-dags-1kem</guid>
      <description>&lt;h2&gt;
  
  
  Making Sense of Geospatial Data Workflows: Introducing STACD
&lt;/h2&gt;

&lt;p&gt;Working with geospatial data is like cooking a complex meal with many ingredients and steps. You start with raw satellite imagery, digital elevation maps, and machine learning models, then process them through multiple algorithms to create useful outputs like land-use maps or terrain classifications. But here's the problem: when you update one ingredient or change how you cook something, it's nearly impossible to track which dishes need to be remade.&lt;/p&gt;

&lt;p&gt;This challenge affects everyone working on environmental monitoring, climate analysis, and sustainable development projects. Researchers waste time recomputing entire workflows when only small parts have changed, and it's difficult to reproduce scientific results because we don't have good records of how datasets were created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhhfkfstug255dz17bwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhhfkfstug255dz17bwm.png" alt="Multi-level lineage workflow example" width="414" height="321"&gt;&lt;/a&gt;&lt;br&gt;&lt;em&gt;Multi-level lineage workflow example&lt;/em&gt;
  &lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with Current Standards
&lt;/h3&gt;

&lt;p&gt;The geospatial community uses a popular standard called STAC (SpatioTemporal Asset Catalog) to organize datasets. While STAC is excellent for finding and sharing individual datasets, it has a critical limitation: it only tracks direct parent-child relationships between datasets. If you want to know the complete history of how a dataset was created which algorithms were used, what versions, what input parameters STAC doesn't capture this information systematically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Our Solution: STACD
&lt;/h3&gt;

&lt;p&gt;We developed STACD (STAC Extension with DAGs), which adds workflow awareness to the STAC standard. The key insight is to represent geospatial processing workflows as Directed Acyclic Graphs (DAGs) essentially, flowcharts that show how data flows through different processing steps.&lt;/p&gt;

&lt;p&gt;STACD extends STAC with three main capabilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete Lineage Tracking&lt;/strong&gt;: Every dataset records not just its immediate parents, but the entire chain of algorithms, input datasets, and parameters used to create it. This is like having a complete recipe that includes not just the ingredients, but every cooking step, temperature, and timing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algorithm Versioning&lt;/strong&gt;: STACD introduces a formal way to describe algorithms and their versions. When you update a terrain classification algorithm or switch from one machine learning model to another, the system tracks which datasets need to be recomputed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Selective Recomputation&lt;/strong&gt;: Instead of rerunning everything, STACD identifies exactly which parts of a workflow are affected by changes. If you update your elevation data source, only the terrain processing branch needs to run again your land-use analysis can stay untouched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation and Real-World Use
&lt;/h3&gt;

&lt;p&gt;We built a reference implementation using Apache Airflow, a popular workflow management tool. Our system maintains a database that tracks every algorithm execution, records complete lineage information, and provides visualization tools to understand complex dependencies. We're now migrating the CoRE stack pipelines to use this approach.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6zwy4p08ormfodap6eg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6zwy4p08ormfodap6eg.png" alt="Overall System Architecture" width="412" height="447"&gt;&lt;/a&gt;&lt;br&gt;&lt;em&gt;Overall System Architecture&lt;/em&gt;
  &lt;/p&gt;

&lt;p&gt;The practical benefits are significant. When we demonstrated STACD with a real workflow processing terrain and land-use data, we showed how updating just the satellite imagery automatically triggered reprocessing of only the affected outputs, saving substantial computation time and resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Looking Forward
&lt;/h3&gt;

&lt;p&gt;STACD opens exciting possibilities for collaborative geospatial computing. Imagine a global registry where researchers can share not just datasets, but complete processing workflows. Different institutions could pool computational resources and reuse each other's algorithms, creating a decentralized infrastructure for planetary-scale environmental analysis.&lt;/p&gt;

&lt;p&gt;This work represents a step toward more reproducible, efficient, and collaborative geospatial science. By standardizing how we track data lineage and algorithm dependencies, we can build more reliable systems for addressing critical environmental challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paper&lt;/strong&gt;: &lt;a href="https://dl.acm.org/doi/10.1145/3759536.3763803" rel="noopener noreferrer"&gt;STACD: STAC Extension with DAGs for Geospatial Data and Algorithm Management&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Code&lt;/strong&gt;: &lt;a href="https://github.com/SaharshLaud/STACD-Airflow" rel="noopener noreferrer"&gt;STACD-Airflow Reference Implementation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published at PROPL 2025 (Programming for the Planet workshop, co-located with ICFP/SPLASH)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>computerscience</category>
      <category>geospatial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How I started my Opensource journey with just 1 line of code!</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Tue, 26 Oct 2021 19:00:18 +0000</pubDate>
      <link>https://dev.to/saharshlaud/how-i-started-my-opensource-journey-with-just-1-line-of-code-285k</link>
      <guid>https://dev.to/saharshlaud/how-i-started-my-opensource-journey-with-just-1-line-of-code-285k</guid>
      <description>&lt;p&gt;With the changing times, the recruitment process in many companies has evolved significantly as organizations are now more interested in skills in an individual rather than their educational qualifications. Many companies have even removed the criteria for college degrees in their hiring process and only look at your skills and expertise. &lt;/p&gt;

&lt;p&gt;Now you might think, how can I show my skills and expertise to a recruiter? The most straightforward and powerful answer is Open-source and Github. Contributing to Open-source projects is considered one of the most effective ways to demonstrate your expertise and your ability to take the initiative on your own and collaborate with a community. &lt;/p&gt;

&lt;p&gt;GitHub is the most popular platform for Open-source collaborations, but it might be slightly challenging to get started with Open-source contributions as a beginner. &lt;br&gt;
Worry no more since I have brought the best beginner-friendly GitHub repository to give you the required boost in your Open-source journey.&lt;/p&gt;

&lt;p&gt;So let us get started with the entire process that I've myself used to begin my opensource collaboration journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's get familiar😎
&lt;/h2&gt;

&lt;p&gt;Before diving into our open-source contribution on GitHub, let us understand some of the important terms we will come across while contributing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Repository -&lt;/strong&gt; It is a storage space or a directory where your projects can reside. You can keep all your code files, text files, image files, etc., inside a repository.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Fork -&lt;/strong&gt; It is a copy of the GitHub repository under your account that you can manage. This way, you can make changes to a project without affecting the original repository and even fetch updates from or submit changes to the original repository with pull requests.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Clone -&lt;/strong&gt; It is a copy of the repository on &lt;a href="http://github.com/" rel="noopener noreferrer"&gt;GitHub.com&lt;/a&gt; on your local system. Cloning pulls down a full copy of all the online repository data at that point in time, including all versions of every file and folder in the repo.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Branch -&lt;/strong&gt; It is a new version of the repository that diverges from the main working project and can be used to create an isolated development space without affecting other branches. You can merge a branch into another branch using a pull request.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Commit -&lt;/strong&gt; It is similar to the save command except that every time you save, it creates a unique ID (“SHA” or “hash”) that allows you to keep a record of what changes were made, when they were made and by whom.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Push -&lt;/strong&gt; It is the process of uploading or committing changes from your local clone repository to the remote repository (i.e. the online repo). Pushing sends the recent commit history from your local repository up to GitHub.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pull Request -&lt;/strong&gt; It is a way to notify the maintainers about the changes you have pushed in your branch and ask them to review these changes and merge them with the main repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites🧐
&lt;/h2&gt;

&lt;p&gt;Before we begin the process for our open-source contribution, let me quickly tell you some prerequisites for this tutorial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Git&lt;/strong&gt; - Git backs all GitHub repositories. Since we will be performing all changes on a local copy and then pushing these to the remote repository, we will definitely require Git installed on our system to clone, create a branch and push changes to the remote branch. You can download Git for your system from this link: &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git Download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;VS Code&lt;/strong&gt; - VS Code is an Integrated Development Environment that will help us to perform actions such as clone, branching, push, publish, etc., with minimal effort. We will also make the required code changes using VS Code. You can download VS Code for your system from this link: &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;VS Code Download&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Time to Contribute🤩🚀
&lt;/h2&gt;

&lt;p&gt;Finally, we can get started with our contribution. The project that we will be contributing to is called &lt;a href="https://github.com/firstcontributions" rel="noopener noreferrer"&gt;&lt;strong&gt;First Contributions&lt;/strong&gt;&lt;/a&gt;, which is primarily meant for beginners to open-source and aims at providing them with a simplified guide to make their first contribution. The repository has more than &lt;strong&gt;21k&lt;/strong&gt; stars and more than &lt;strong&gt;40k&lt;/strong&gt; forks so far, showing how popular it is among beginners in the open-source community.&lt;/p&gt;

&lt;p&gt;Let us begin with the steps to make our first contribution to open-source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-1 : Forking the Repository
&lt;/h3&gt;

&lt;p&gt;The first step to get started with any open-source contribution through GitHub us forking the main project repository. Go to the &lt;a href="https://github.com/firstcontributions/first-contributions" rel="noopener noreferrer"&gt;first-contributions&lt;/a&gt; GitHub repository and fork it by clicking on the fork icon on the top right corner. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl8zpgnne6j4vkx88lwj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl8zpgnne6j4vkx88lwj.jpg" alt="Forking Repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how your forked repository will look like: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zkt3gc680zugjo8dt8d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zkt3gc680zugjo8dt8d.jpg" alt="Forked Repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-2 : Cloning to local system
&lt;/h3&gt;

&lt;p&gt;The next step is cloning the forked repository to your local system so that you can easily make the required changes. &lt;br&gt;
For this, head over to your forked repository, click on the &lt;strong&gt;Code&lt;/strong&gt; button and copy the URL shown. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmaq8kis3j0qyxcwevqk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmaq8kis3j0qyxcwevqk.jpg" alt="Cloning Repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CAREFUL:&lt;/strong&gt; While cloning the repository make sure that you clone the repo you &lt;strong&gt;forked &lt;em&gt;from&lt;/em&gt;&lt;/strong&gt; rather than cloning your repo. Check your browser's address bar and make sure you are cloning your repo and not the original repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next we'll head over to Visual Studio Code to clone the repository. Open the Command Palette by pressing the shortcut key &lt;strong&gt;F1&lt;/strong&gt; and then type in &lt;code&gt;git clone&lt;/code&gt;, only  &lt;code&gt;git&lt;/code&gt;  or  &lt;code&gt;clone&lt;/code&gt;  (it works like a search). Select the Entry  &lt;code&gt;Git: Clone&lt;/code&gt;  and press  &lt;code&gt;Enter&lt;/code&gt;.&lt;br&gt;
If you have properly installed Git on your system you will automatically see the &lt;code&gt;Git: Clone&lt;/code&gt; option.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gwtkgc92fjehqo0uzmw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gwtkgc92fjehqo0uzmw.jpg" alt="Git Clone"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the URL of the forked repository that you copied earlier and press Enter. &lt;br&gt;
VS Code asks you to select the location at which you want to store your cloned repository. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw39ch31rse4umdws19nl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw39ch31rse4umdws19nl.jpg" alt="Cloning to local system"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the location and the cloning process will start automatically. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogbitflvyp73998a6q8e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogbitflvyp73998a6q8e.jpg" alt="Cloning"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the successful clone, VS Code asks you to Open the cloned repository in the same window or a new window. Select any option to see the contents of your cloned repository. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step-3 : Creating a Branch
&lt;/h3&gt;

&lt;p&gt;Now that you've cloned your repository, it's always a good habit to create a branch when you're doing development work that is somewhat experimental in nature. This way you can work on a feature or an issue and merge and see if many features work well together or not.&lt;br&gt;
Open up the command palette again by pressing &lt;code&gt;F1&lt;/code&gt;. Type in &lt;code&gt;branch&lt;/code&gt; and select the &lt;code&gt;create branch&lt;/code&gt; command from there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckurxztaleclih63ea6p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckurxztaleclih63ea6p.jpg" alt="Branch option"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next dialog box asks for your branch name. Provide a proper branch name and press Enter.  The branch will be created with the given name and it is also already checked out.  &lt;/p&gt;

&lt;p&gt;The git checkout command is used to switch between branches in a repository. It &lt;strong&gt;checks the branches and updates the files in the working directory&lt;/strong&gt; to match the version already available in that branch, and it forwards the updates to Git to save all new commit in that branch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76onn09kcdkh9aogfzf4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76onn09kcdkh9aogfzf4.jpg" alt="Branch Created"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-4 : Making code changes
&lt;/h3&gt;

&lt;p&gt;Now its time to add your name as a Contributor to this repository. Open the &lt;code&gt;Contributors.md&lt;/code&gt; file and add your name anywhere in the file. The code in this file is in Markdown language which is a lightweight markup language for creating formatted text using a plain-text editor.&lt;br&gt;
You can also copy-paste anyone of the existing entries and make changes to it. Add your name and GitHub profile link anywhere in the file and save it. You can see that as soon as you save, an icon appears in the source control tab in the left panel indicating that there are changes made to the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb97t06usjpoidenvfgy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb97t06usjpoidenvfgy.jpg" alt="Changing Contributor file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-5 : Commit &amp;amp; Push changes to GitHub
&lt;/h3&gt;

&lt;p&gt;On the left panel click on the Source Control icon. You can see all the files that have been altered after the last commit. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeusvfgd4tc7jror1g6q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeusvfgd4tc7jror1g6q.jpg" alt="Source Control"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the plus (+) icon to stage the changes. The staging area is a file, in your Git directory, that stores information about what will go into your next commit.&lt;/p&gt;

&lt;p&gt;Type a commit message in the top line and click on the check mark icon to commit changes to your local repository. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9yjtvo981nwdwfccnxv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9yjtvo981nwdwfccnxv.jpg" alt="Commit changes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After committing the changes, you can see an option for &lt;strong&gt;Publish Changes&lt;/strong&gt; to push your changes back to GitHub. Click on this option to publish your changes back to GitHub. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hdv26lymii125npumkq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hdv26lymii125npumkq.jpg" alt="Publish Changes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uh-Oh!&lt;/strong&gt; Something's not right. You must have got an error message as shown below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foo0eser5vfj1rrna8zdu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foo0eser5vfj1rrna8zdu.jpg" alt="Git Error"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems that you need to tell your identity to Git in order to proceed further. Let's rectify this issue. Head over to the terminal by pressing shortcut key &lt;strong&gt;Ctrl+Shift+`&lt;/strong&gt;.&lt;br&gt;
Then run the following commands to set the global username and global email.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Set your username:  
    git config --global user.name "FIRST_NAME LAST_NAME"
// Set your email address:  
    git config --global user.email "MY_NAME@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7helzoxevb3ccqb56qq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7helzoxevb3ccqb56qq.jpg" alt="Git Config"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: If you don't get any such error, there is nothing to worry. It simply means that your global username and email are already registered with Git.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now that we have set our global username and email, head back to the &lt;strong&gt;Publish Changes&lt;/strong&gt; option in the Source Control Panel. A dialog box opens that asks you to login to your GitHub account. Login using your GitHub credentials and if all goes well, your commits will be pushed from your local repository to your GitHub repository online.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsuxukkut6g3yrv2n07t9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsuxukkut6g3yrv2n07t9.png" alt="GitHub Login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-6 : Create a Pull Request
&lt;/h3&gt;

&lt;p&gt;If you have followed all the above steps correctly, then you should see a message in your forked repository that shows your new branch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71bg4bel8imhhblassiq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F71bg4bel8imhhblassiq.jpg" alt="Branch Pushed to GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point the changes that you have made reside on your side of the repository. Now we will create a pull request to submit a request to the administrator of the top-level repo to merge your change into the main branch.&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;Compare &amp;amp; pull request&lt;/strong&gt; option as shown in the image above. This opens up the Pull Request page where you will edit your Pull Request. &lt;/p&gt;

&lt;p&gt;Here you can also see if your branch can be merged with the main branch or not. You need to provide a title for your pull request and you can also provide some extra comments for the maintainer of the repository. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4g10uo4tdgtw662rs02.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4g10uo4tdgtw662rs02.jpg" alt="Open Pull Request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this your Pull Request will be assigned a number and marked as Open until the maintainer reviews it and merges your code. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fres83kezn0ew95kuqtd3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fres83kezn0ew95kuqtd3.jpg" alt="Open Pull Request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The maintainer might ask you to make some changes or if everything is fine, your pull request will be successfully accepted and your code changes will be merged into the master branch of this project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftphpkb5bf7no7z2cgnud.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftphpkb5bf7no7z2cgnud.jpg" alt="Pull Request Accepted"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that your code changes have been merged into the master branch, you can see your name in the Contributor's list. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff004bkm1bdq0iz21fv3y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff004bkm1bdq0iz21fv3y.jpg" alt="Final Name Added"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have now successfully made your first open-source contribution with just a single line of code!&lt;/p&gt;

&lt;h2&gt;
  
  
  Made my first contribution now what?
&lt;/h2&gt;

&lt;p&gt;Congratulations! You’ve successfully made your first open-source contribution and completed the standard &lt;em&gt;fork -&amp;gt; clone -&amp;gt; edit -&amp;gt; PR&lt;/em&gt; workflow that you’ll often encounter as a contributor!&lt;/p&gt;

&lt;p&gt;Don’t let this momentum die! Try to find more repositories based on your skillset and contribute to these projects. The best thing is that you don’t need to be an expert to contribute to open-source. You can even visit the &lt;a href="https://firstcontributions.github.io/" rel="noopener noreferrer"&gt;First-Contributions website&lt;/a&gt; to see some of the amazing open-source projects you can contribute to.&lt;/p&gt;

&lt;p&gt;I have also published an article that focuses on how you can become an active open-source contributor which you can access &lt;a href="https://dev.to/aviyel/open-source-community-how-to-become-an-active-contributor-f3d"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hope you enjoyed my blog. Thanks for reading and keep contributing!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to comment, share and reach out to me on &lt;a href="https://dev.to/saharshlaud"&gt;Dev.to&lt;/a&gt; , &lt;a href="https://twitter.com/saharshlaud" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; , or &lt;a href="https://in.linkedin.com/in/saharsh-laud" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; .&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>opensource</category>
      <category>beginners</category>
      <category>github</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Image Processing is Easier than you Thought! (Getting started with Python Pillow)</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Wed, 13 Oct 2021 15:14:56 +0000</pubDate>
      <link>https://dev.to/saharshlaud/image-processing-is-easier-than-you-thought-getting-started-with-python-pillow-329k</link>
      <guid>https://dev.to/saharshlaud/image-processing-is-easier-than-you-thought-getting-started-with-python-pillow-329k</guid>
      <description>&lt;p&gt;We live in a digital world today, with data flowing all around us. We come across lots of digital images, which has made &lt;strong&gt;digital image processing&lt;/strong&gt; very beneficial for us since it allows us to enhance an image and helps in the extraction of useful information from these images.&lt;/p&gt;

&lt;p&gt;Python is a general-purpose programming language that provides many image processing libraries for adding image processing capabilities to digital images. Some of the most common image processing libraries in Python are &lt;a href="https://opencv.org/" rel="noopener noreferrer"&gt;OpenCV&lt;/a&gt;, &lt;a href="https://pypi.org/project/Pillow/" rel="noopener noreferrer"&gt;Python Imaging Library (PIL)&lt;/a&gt;, &lt;a href="https://scikit-image.org/" rel="noopener noreferrer"&gt;Scikit-image&lt;/a&gt; etc.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Python Imaging Library (PIL)&lt;/strong&gt; is also known as Pillow in the newer versions, although Pillow has forked the PIL repository and added Python 3. x Support.&lt;/p&gt;

&lt;p&gt;The following steps are generally followed while processing an image:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Importing the image via image acquisition tools.&lt;/li&gt;
&lt;li&gt;  Analyzing and manipulating the image.&lt;/li&gt;
&lt;li&gt;  Output can be an altered image or a report based on that image.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PIL is the best option for performing simple image processing such as resizing (scaling), rotation, trimming (partial cutout), and applying various filters to an image since it is simpler and easier to understand than other libraries such as OpenCV. It comes with support for a wide variety of image formats such as “jpeg”, “png”, “gif”, “ppm”, “tiff”, etc., which makes image processing relatively easier.&lt;/p&gt;

&lt;p&gt;Today we shall take a deep dive into Python PIL and its features along with the code implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Installation:&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Windows:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We can install pillow using pip on Windows systems. Just run the below command in your command prompt window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;​pip install pillow 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;easy_install Pillow  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;MacOS:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To install Pillow on MacOS run the following code on your Bash terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo pip install Pillow  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Linux:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To install Pillow on Linux machines simply use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo pip install Pillow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Loading an image:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For loading an image, firstly we need to import the  &lt;code&gt;Image&lt;/code&gt; from PIL and then call the &lt;code&gt;Image.open()&lt;/code&gt; function, passing the image path. A value of the Image object data type is returned by the &lt;strong&gt;&lt;code&gt;Image.open()&lt;/code&gt;&lt;/strong&gt; function, and this image object can be used to perform various image manipulations with the help of other methods. All the modifications made to the image object can be saved to an image file with the  &lt;strong&gt;&lt;code&gt;save()&lt;/code&gt;&lt;/strong&gt;  method. The  &lt;strong&gt;&lt;code&gt;show()&lt;/code&gt;&lt;/strong&gt;  method displays the image that has been loaded in the image object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing the module
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; 

&lt;span class="c1"&gt;# opening the image stored in the local path.
&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48vqimcxe7j96kvy369s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48vqimcxe7j96kvy369s.jpg" alt="Opening an Image with Pil"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Basic Image Properties:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We can find the basic properties of the image such as size(width, height), format and mode using different functions in the Image module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing the module
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; 

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Find image dimensions i.e. width and height
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image size:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

&lt;span class="c1"&gt;# Find the image format
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image format:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Find the image mode i.e. RGB, RGBA, HSV etc.
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image mode:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image size: (1280, 853)

Image format: JPEG

Image mode: RGB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Converting image into other formats:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;​​We can easily convert one image into other format using the  &lt;strong&gt;&lt;code&gt;save()&lt;/code&gt;&lt;/strong&gt;  method in Image module. This method takes two arguments, first the name of the new file and second the format into which we want to convert the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#importing the module
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; 

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Changing image format and saving the new image
&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Kingfisher.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;The following is the image with changed format:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxll1ba8v0o8d9o3kytny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxll1ba8v0o8d9o3kytny.png" alt="Changing image format"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Cropping images:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The  &lt;strong&gt;&lt;code&gt;Image.crop()&lt;/code&gt;&lt;/strong&gt;  method helps in cropping the image and we can specify the dimensions of the crop. The  &lt;code&gt;crop()&lt;/code&gt;  method takes a 4-valued tuple defining the left, upper, right, and lower pixel coordinates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#importing the module
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; 

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Cropping the loaded image using crop()
&lt;/span&gt;&lt;span class="n"&gt;img_crop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;crop&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;img_crop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kg21h0cgmw5t854033x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kg21h0cgmw5t854033x.png" alt="Cropped Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Rotating images:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The  &lt;strong&gt;&lt;code&gt;Image.rotate()&lt;/code&gt;&lt;/strong&gt;  function can be used to rotate an image. It takes the rotation degree value as a parameter and returns a rotated copy of the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Rotating image using rotate() function by 90 degrees.
&lt;/span&gt;&lt;span class="n"&gt;img_rotate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img_rotate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Kingfisher_Rotated.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb38hqh38q0z3n2i7zk8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb38hqh38q0z3n2i7zk8.jpg" alt="Rotated Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Resizing images:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The  &lt;strong&gt;&lt;code&gt;Image.resize()&lt;/code&gt;&lt;/strong&gt;  function can be used to resize an image to required height and width. The function takes width and height as a tuple and returns an image object of resized format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Resizing an image using resize() function.
&lt;/span&gt;&lt;span class="n"&gt;img_resize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;img_resize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3nadwv5qybsu9yqfjxn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3nadwv5qybsu9yqfjxn.jpg" alt="Resized Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Blur an image:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The  &lt;code&gt;ImageFilter&lt;/code&gt;  module consists of definitions for a pre-defined set of filters. These filters can be used with the  &lt;code&gt;filter()&lt;/code&gt;  method and we can even blur an image by applying  &lt;strong&gt;&lt;code&gt;ImageFilter.BLUR&lt;/code&gt;&lt;/strong&gt;  on the original image. The filter function then returns an image object that contains the blurred copy of the original image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing Image and ImageFilter modules
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFilter&lt;/span&gt; 

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Applying blur operation on the image
&lt;/span&gt;&lt;span class="n"&gt;img_blur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImageFilter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BLUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

&lt;span class="n"&gt;img_blur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faitficin90a3ywcfg2wl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faitficin90a3ywcfg2wl.jpg" alt="Blurred Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Grayscale Image:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The  &lt;strong&gt;&lt;code&gt;Image.convert()&lt;/code&gt;&lt;/strong&gt;  method allows us to convert colored images into grayscale images (black and white).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing Image and ImageFilter modules
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFilter&lt;/span&gt; 

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;grayscale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;grayscale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvp28dhm07e6o3da8dcp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvp28dhm07e6o3da8dcp.jpg" alt="Grayscale Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Image enhancement filters:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The  &lt;strong&gt;&lt;code&gt;ImageFilter&lt;/code&gt;&lt;/strong&gt;  module contains various filters that can be used for image enhancement such as &lt;strong&gt;CONTOUR, DETAIL, EDGE_ENHANCE, EMBOSS, SMOOTH, SHARPEN&lt;/strong&gt;, etc. Some of these filters are displayed below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing modules
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFilter&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Applying filters
&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImageFilter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;img2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImageFilter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EMBOSS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;img2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Contour filter:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8we4abiptjvk1gb90ob2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8we4abiptjvk1gb90ob2.jpg" alt="Contour filter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Emboss filter:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvy26r0p1y93wrmcx8q5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvy26r0p1y93wrmcx8q5.jpg" alt="Emboss filter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Drawing on image:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Using the &lt;code&gt;ImageDraw&lt;/code&gt;  module, we can easily draw simple 2D graphics on top of existing Image objects. After importing the ImageDraw module, we simply create an  &lt;strong&gt;&lt;code&gt;ImageDraw.Draw&lt;/code&gt;&lt;/strong&gt;  object passing the Image object as the parameter. Then we can we can draw various objects such as line, rectangle, circle, triangle, etc. using the inbuilt functions. Here we have drawn a rectangle on the existing image. The  &lt;strong&gt;&lt;code&gt;rectangle()&lt;/code&gt;&lt;/strong&gt;  function takes three parameters: the position of the four corner points, the outline color and the fill color values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing required modules
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;

&lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D:/Image/Kingfisher.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;draw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Drawing a rectangle using rectangle method()
&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk4fawldtc2io5hsddbz2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk4fawldtc2io5hsddbz2.jpg" alt="Rectangle drawn using Pil"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Getting RGB values:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The ImageColor module consists of functions relating to RGB manipulation.  &lt;strong&gt;&lt;code&gt;ImageColor.getrgb()&lt;/code&gt;&lt;/strong&gt;  method converts a color value passed as a string into the equivalent RGB format. It takes the color string as an input and returns a tuple of RGB values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing ImageColor module
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ImageColor&lt;/span&gt;

&lt;span class="n"&gt;im1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getrgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#00ff00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;im2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getrgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yellow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(0, 255, 0)

(255, 255, 0)  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can even create a new image consisting of given RGB color value using the  &lt;strong&gt;&lt;code&gt;new()&lt;/code&gt;&lt;/strong&gt;  and  &lt;strong&gt;&lt;code&gt;getrgb()&lt;/code&gt;&lt;/strong&gt;  method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# importing required modules
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageColor&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ImageColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getrgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#FF7103&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzul2scg7hqjcpl3i81m2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzul2scg7hqjcpl3i81m2.jpg" alt="RGB Output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Last words.....
&lt;/h2&gt;

&lt;p&gt;This was all about the Python Imaging Library and its basic functionalities. The PIL library makes it relatively easy to adjust and process images according to our requirements with just a few lines of code. Now, what are you waiting for? Go ahead and get started with your image processing journey.&lt;/p&gt;

&lt;p&gt;Hope you enjoyed my blog. Thanks for reading!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to comment, share and reach out to me on &lt;a href="https://dev.to/saharshlaud"&gt;Dev.to&lt;/a&gt; , &lt;a href="https://twitter.com/saharshlaud" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; , or &lt;a href="https://in.linkedin.com/in/saharsh-laud" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; .&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>pillow</category>
      <category>imageprocessing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Use these expert-verified tips to enhance your technical writeups!</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Mon, 11 Oct 2021 13:15:33 +0000</pubDate>
      <link>https://dev.to/saharshlaud/use-these-tips-to-enhance-your-technical-writeups-3239</link>
      <guid>https://dev.to/saharshlaud/use-these-tips-to-enhance-your-technical-writeups-3239</guid>
      <description>&lt;p&gt;There is no better feeling in this world than having your thoughts transformed into words and those words being helpful to other people. The entire essence of Technical writing is to convert complex technical terminologies into a clear, concise, and easily understandable format for your audience. &lt;/p&gt;

&lt;p&gt;While the result of technical writing seems to be quite clear, the process of reaching that goal is definitely not a piece of cake. The main point here is to keep things simple for the audience which a lot of writers struggle to incorporate in their write ups. &lt;/p&gt;

&lt;p&gt;I recently had the chance to be a part of the Hashnode Technical Writing Bootcamp where I met some of the most outstanding personalities in the technical writing community ( &lt;a href="https://hashnode.com/@quincy"&gt;Quincy Larson&lt;/a&gt; ,  &lt;a href="https://hashnode.com/@tanoaksam"&gt;Sam Sycamore&lt;/a&gt; ,  &lt;a href="https://hashnode.com/@didicodes"&gt;Edidiong Asikpo&lt;/a&gt; ,  &lt;a href="https://hashnode.com/@dailydevtips"&gt;Chris Bongers&lt;/a&gt;  and many others) and the tips and suggestions shared by them surely helped me to shape my thoughts and actions as a technical writer.&lt;/p&gt;

&lt;p&gt;Here are some tips that I think are useful for any technical writer despite the experience level or background:&lt;/p&gt;

&lt;h2&gt;
  
  
  Beginners Mindset is an Asset
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dc5xt7cA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632461080945/hJrhuqmRD.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dc5xt7cA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632461080945/hJrhuqmRD.jpeg" alt="Beginners-Mindset.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Being a beginner at technical writing might be quite intimidating at times but this lack of expertise can be your biggest advantage also. There are millions of beginners out there just like you who are trying to figure out different technologies. Writing articles with a beginner's mindset makes it easier for the other beginners to relate to your content since they might also have gone through the same steps and encountered the same problems that you did. &lt;/p&gt;

&lt;p&gt;So every time you're learning something new just write about it, the steps that you followed, and any issues that you encountered. This way you'll not only connect with other beginners like yourself but also get your issues resolved by someone who had the same problems and has resolved them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let your personality shine through your articles
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z0K-0MvZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462633100/kigTT_rp0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z0K-0MvZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462633100/kigTT_rp0.jpeg" alt="Standing-out-from-others-cartoon.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Always try to provide a personal tone to your articles instead of copying the theme of an existing article. Being yourself is the best way for your articles to be interesting and unique from the other articles. Nowadays many writers plagiarize technical content and don't even provide proper credits. Just be yourself and try to find your own voice because even if one of your articles blows up, you'll be able to build an audience for yourself and those people will start to notice you for your personality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding your audience
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nma_c1bo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632461279898/GeVAnV27B.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nma_c1bo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632461279898/GeVAnV27B.jpeg" alt="albert-eistein1.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the greatest mistakes technical writers make is an improper perception of their audience. An article on advanced React concepts is of no use if a majority of your readers are beginners in React. So, before writing an article always ask yourself some basic questions such as - What does the audience need? Where will they be reading it? When will they read it? ,etc.&lt;/p&gt;

&lt;p&gt;Through this, you shall have a clear idea of whether your audience requires an in-depth article or a short and simple post, whether the article will pertain to beginners, intermediate or expert audiences, and many other aspects that'll help you to frame your entire article. All your articles should convey proper technical facts but more importantly to the proper audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Research
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bI-HAJFD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462367337/-bMgzHx26.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bI-HAJFD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462367337/-bMgzHx26.jpeg" alt="research.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The backbone of technical writing lies in the research around the topic that you are writing on. Try to understand every minute detail of the topic clearly and before writing an article to explain it to your audience. Lack of proper research and correct technical information is what stops an ordinary writer from becoming extraordinary. &lt;/p&gt;

&lt;p&gt;If you have sound knowledge about the concepts that you want to write on, you can easily break them down into simpler ideas to better explain them to your audience and the only way to do so is through rigorous research. In short, &lt;strong&gt;Google the hell out of things that you want to write about.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It's okay to not know
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XCtCnZUx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462333248/UKQQ0jsbi.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XCtCnZUx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462333248/UKQQ0jsbi.jpeg" alt="clueless.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you might not have all the desired skills required for technical writing and that is totally fine. The most important aspect of technical writing is to start writing even if you might not know certain things. Just start writing because you can always learn other skills on the way. There are a lot of resources that can help you such as technical writing courses, style guides, technical communities, etc. &lt;/p&gt;

&lt;h2&gt;
  
  
  Proper Reviews
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--roRw7ah4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462698585/7u3EyPbY8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--roRw7ah4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462698585/7u3EyPbY8.jpeg" alt="review.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reviewing and proofreading are essential tasks that should be performed multiple times before publishing an article online. Don't be in a rush to publish your article after the first draft. If possible take some time off from the article after finishing the first draft and then try to come back for a second look at it. This way you will have a fresh start for your review and you might even notice certain pointers that you didn't notice before. &lt;/p&gt;

&lt;p&gt;Try to fine-tune your article to perfection. However perfect your first draft might seem there are always some changes that you can do. You can even take help from your friends, colleagues, community members to review your draft and provide suggestions. It is always better to publish a properly reviewed article than the first draft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grammar
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nEYecHtX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462784136/xRg7kXzf2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nEYecHtX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632462784136/xRg7kXzf2.jpeg" alt="grammar.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Believe it or not but all great technical articles have one thing in common, "&lt;strong&gt;proper grammar&lt;/strong&gt;". Grammar is the base of an article and improper grammar might lead to falling interest from the readers. However great your technical knowledge and skills might be, if you can't follow basic grammar rules in your write ups, this knowledge is of no use to your audience. Articles with grammatical errors often detract from the message or image the writer is trying to portray. So always pay attention to the grammar in your article and you can even use tools such as Grammarly for your assistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try to be consistent
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N0lWr73P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632463031949/_Gca02fsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N0lWr73P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632463031949/_Gca02fsp.png" alt="consitent.png"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://h.daily-dev-tips.com/learn-how-to-come-up-with-article-ideas-and-stay-consistent-cktmign6f042onss1h377cwpd"&gt;Chris Bongers&lt;/a&gt; during his session at Hashnode Bootcamp said that there can be two meanings to being consistent according to him: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Consistency of Time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Consistency of efforts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consistency of time simply means that you are consistent in the time that you spend on writing and publishing articles. Consistency of efforts means that you put in a constant effort in all your articles no matter how the article performs online. Both of these standards correspond to consistent writing. &lt;/p&gt;

&lt;p&gt;Being consistent is a key factor because many writers start with huge excitement and might even publish several articles in the initial phases but then as time passes several factors such as personal problems, work schedule, content not getting traction, etc. might lead to fading away of the excitement and efforts.&lt;/p&gt;

&lt;p&gt;Always try to keep writing despite all other things in your path and try to set some weekly or monthly writing goals to help you remain consistent because readers love to get fresh content and writing might even help you to de-stress yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JM_ob5Iw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632463151136/nvJIZICm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JM_ob5Iw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632463151136/nvJIZICm2.png" alt="tooling-removebg-preview.png"&gt;&lt;/a&gt;&lt;br&gt;
You might be giving your best efforts but with proper tooling, you can enhance your productivity even further. There is a huge array of tools available for each and every requirement whether it be publishing, authoring, scheduling, image editing, spell-checking, or anything else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.grammarly.com/"&gt;Grammarly &lt;/a&gt; is probably the most used spell-check tool in the world and you can use its features to ensure proper grammar in your articles.  &lt;a href="https://www.notion.so/"&gt;Notion &lt;/a&gt; is another great tool that can be used to keep a list of article ideas, schedules, and even drafts for reviewing. &lt;/p&gt;

&lt;p&gt;The word tooling is not specifically restricted to software tools or apps. Any resource that can assist you in your technical writing journey can be considered a tool. &lt;strong&gt;Writer's groups, blogging communities, discord channels, events, social media&lt;/strong&gt;, etc. are all such tools that might not have a specific set of features for you but they will surely help you enhance your content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphics and Stats
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v7E_oNPK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632463250418/aXYUqmv8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v7E_oNPK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1632463250418/aXYUqmv8l.png" alt="Screenshot 2021-09-23 133333.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Graphics and visual aids can help your readers to better understand a particular concept. Always try to include proper graphics such as images, illustrations, or videos that are related to the idea that you are focusing on. Visuals appeal more to the audience than written content and if you can have a perfect blend between the two, then you'll surely have better audience retention for your articles. &lt;/p&gt;

&lt;p&gt;While graphics and images enhance the look and feel of your draft, statistics help in building trust and credibility around your technical content. Including properly researched statistics along with the reference to the source is generally considered a good practice especially for technical articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Last Words…..
&lt;/h2&gt;

&lt;p&gt;So there you have it! These were some of the tips that will surely help in your technical writing journey.&lt;/p&gt;

&lt;p&gt;Many people think technical writing to be too complex as a profession or even a part-time hobby but the reality is that the complexity of technical writing lies in the writer's mind. Presenting information in a simple and easy to grasp manner is the main focus of technical writing which if followed correctly will automatically drive the audience towards your writeups. So what are you waiting for grab a cup of coffee and get started on that blog post!&lt;/p&gt;

&lt;p&gt;Hope you enjoyed my blog. Thanks for reading!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to comment, share and reach out to me on &lt;a href="https://dev.to/saharshlaud"&gt;Dev.to&lt;/a&gt;,  &lt;a href="https://twitter.com/saharshlaud"&gt;Twitter&lt;/a&gt; , or  &lt;a href="https://in.linkedin.com/in/saharsh-laud"&gt;LinkedIn&lt;/a&gt; .&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tips</category>
      <category>beginners</category>
      <category>writing</category>
      <category>community</category>
    </item>
    <item>
      <title>Face Detection in just 15 lines of Code! (ft. Python and OpenCV)</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Fri, 08 Oct 2021 16:13:29 +0000</pubDate>
      <link>https://dev.to/saharshlaud/face-detection-in-just-15-lines-of-code-ft-python-and-opencv-37ci</link>
      <guid>https://dev.to/saharshlaud/face-detection-in-just-15-lines-of-code-ft-python-and-opencv-37ci</guid>
      <description>&lt;p&gt;Whether you have recently started exploring &lt;a href="https://opencv.org/" rel="noopener noreferrer"&gt;OpenCV&lt;/a&gt; or have been working with it for quite some time, in either scenario, you must have come across the term &lt;strong&gt;Face Detection&lt;/strong&gt;. As machines continue to become more and more intelligent, their capability to mimic human behavior also seems to increase and Face Detection is one of these advancements in AI. &lt;/p&gt;

&lt;p&gt;So today, we shall take a quick look at what Facial Detection is, why it is useful and how you can practically implement Face Detection on your system in just 15 lines of code! &lt;/p&gt;

&lt;p&gt;Let's get started by understanding Facial Detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Facial Detection? (Explain Like I'm five)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ema1gfz6928sq4ychr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ema1gfz6928sq4ychr2.png" alt="Facial Detection Example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Facial detection is a computer technology based on Artificial Intelligence that is capable of identifying and locating the presence of human faces in digital photos and videos. In short, the capability of a machine to detect human faces in an image or a video.&lt;/p&gt;

&lt;p&gt;Due to the significant advancements in AI, it is now possible to detect faces in an image or video, regardless of lighting conditions, skin color, head pose, and background.&lt;/p&gt;

&lt;p&gt;Face Detection is the starting point of several face-related applications such as facial recognition or facial verification. Today, the cameras in most digital devices utilize face detection technology to detect where the faces are and adjust the focus accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  So how does Face Detection work?
&lt;/h2&gt;

&lt;p&gt;Glad you asked! The backbone of any face detection application is an algorithm (a simple step-by-step guide for the machine to follow) that assists in determining whether the images are positive images (images with faces) or negative images (images without faces).&lt;/p&gt;

&lt;p&gt;In order to do this accurately, the algorithms are trained on massive datasets containing hundreds of thousands of face images and non-face images. This trained machine learning algorithm can then detect whether there is a face in the image or not and also place a bounding box if a face is detected. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnd2s469bmoh2qgw6alu8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnd2s469bmoh2qgw6alu8.jpg" alt="Face Detection Process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Face Detection using OpenCV
&lt;/h2&gt;

&lt;p&gt;Computer Vision is one of the most exciting and challenging tasks in Artificial Intelligence, and there are several packages available to solve problems related to computer vision. OpenCV is by far the most popular open-source library for tackling computer-vision-based problems. &lt;/p&gt;

&lt;p&gt;The OpenCV library has more than &lt;strong&gt;18 million downloads&lt;/strong&gt; and an active user community of 47000 members. It has 2500 optimized algorithms, including a comprehensive set of classic and state-of-the-art computer vision and machine learning algorithms, making it one of the most important libraries in the machine learning field.&lt;/p&gt;

&lt;p&gt;Face detection in an image is a simple 3-step process: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Install and import the open-cv module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt; &lt;span class="c1"&gt;# for plotting the image
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Download the Haar-cascade Classifier XML file and load it into the system:&lt;/p&gt;

&lt;p&gt;Haar-cascade Classifier is a machine learning algorithm where we train a cascade function with tons of images. There are different types of cascade classifiers according to different target objects and here we will use a classifier that considers the human face to recognize it as the target object.&lt;/p&gt;

&lt;p&gt;You can find the the trained classifier XML file for face detection &lt;a href="https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Load the cascade
&lt;/span&gt;&lt;span class="n"&gt;face_cascade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CascadeClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;haarcascade_frontalface_default.xml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Use the &lt;strong&gt;detectMultiScale()&lt;/strong&gt; function in the Haar-cascade classifier to detect faces and draw bounding boxes around them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Read the input image
&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Detect faces
&lt;/span&gt;&lt;span class="n"&gt;faces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;face_cascade&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detectMultiScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaleFactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minNeighbors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Draw bounding box around the faces
&lt;/span&gt;&lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;faces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Showing number of faces detected in the image
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faces&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;faces detected!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Plotting the image with face detected
&lt;/span&gt;&lt;span class="n"&gt;finalimg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_RGB2BGR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finalimg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  detectMultiScale() Parameters :
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;image:&lt;/strong&gt; Matrix of the type CV_8U containing an image where objects are detected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;scaleFactor:&lt;/strong&gt; Parameter specifying how much the image size is reduced at each image scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;minNeighbors:&lt;/strong&gt; Parameter specifying how many neighbors each candidate rectangle should have to retain it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;You might need to tweak these values to get the best results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7czy28ehs5nrl5sp424.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7czy28ehs5nrl5sp424.jpg" alt="Face Detected Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voila! Just like that, you can implement one of the most unique applications of Computer Vision.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can find a detailed code template for the entire Face Detection implementation &lt;a href="https://github.com/blobcity/ai-seed/blob/main/Audio%20Visual/Problems/FaceDetection_OpenCV.ipynb" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This tutorial is only meant for face detection in an image file and not a live camera feed or videos. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Before you go....
&lt;/h2&gt;

&lt;p&gt;Aren't you feeling great? You just learned how to implement one of the most fascinating applications of Artificial Intelligence and Machine Learning. Don't stop here! Go ahead and explore other amazing features that OpenCV offers and keep sharing your knowledge. &lt;/p&gt;

&lt;p&gt;Hope you enjoyed my blog. Thanks for reading!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to comment, share and reach out to me on &lt;a href="https://dev.to/saharshlaud"&gt;Dev.to&lt;/a&gt; , &lt;a href="https://twitter.com/saharshlaud" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; , or &lt;a href="https://in.linkedin.com/in/saharsh-laud" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; .&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>opencv</category>
      <category>facedetection</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Open Source Community: How to Become an Active Contributor</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Fri, 24 Sep 2021 13:28:31 +0000</pubDate>
      <link>https://dev.to/saharshlaud/open-source-community-how-to-become-an-active-contributor-f3d</link>
      <guid>https://dev.to/saharshlaud/open-source-community-how-to-become-an-active-contributor-f3d</guid>
      <description>&lt;p&gt;Open-Source development has truly transformed the technical revolution all around the world and the open source community has grown rapidly from its initial stages when &lt;a href="https://stallman.org/" rel="noopener noreferrer"&gt;Richard Stallman&lt;/a&gt; introduced the GNU project, the first “free operating system” to the present scenario where more than &lt;strong&gt;70%&lt;/strong&gt; of the software codebases around the world consist of some open-source components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7f4ogr7zd2x39r9qw5go.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7f4ogr7zd2x39r9qw5go.jpg" alt="Linus Torvalds"&gt;&lt;/a&gt;Open source refers to source code that has been made available to the public to view, use, modify, and distribute under a license.&lt;/p&gt;

&lt;p&gt;The open source &lt;a href="https://opensource.org/community" rel="noopener noreferrer"&gt;community&lt;/a&gt; collaboratively helps in developing and maintaining open-source projects. By becoming a part of the open-source community, you can not only enhance your technical skills but also hone your people skills like communication, giving and receiving feedback, emotional intelligence, etc.&lt;/p&gt;

&lt;p&gt;As a beginner to the open source environment, it can be quite intimidating and confusing as to how one can become an active contributor to open source projects. Today, we’ll explore some strategies that anyone can use to kickstart their open source journey and ultimately become an active contributor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding projects for contribution
&lt;/h2&gt;

&lt;p&gt;One of the most important aspects of becoming an active open-source contributor is the selection of projects to contribute to. Always try to select a project which is familiar to you and you have some prior knowledge about.Working on projects that you already use gives you an edge when contributing because you’re already pretty familiar with its details and this experience will definitely help you in contributing more often towards the project and becoming an active contributor. You can even suggest features that you want in the software or any problems faced while using the product.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6bmkzd6mffp01akj82d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6bmkzd6mffp01akj82d.png" alt="GitHub Labels"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/explore" rel="noopener noreferrer"&gt;GitHub’s explore&lt;/a&gt; page is a great way to find projects based on your preferences and you can even use the search tool by entering beginner-friendly contribution tags like &lt;a href="https://github.com/topics/good-first-issue" rel="noopener noreferrer"&gt;good-first-issue&lt;/a&gt;, &lt;a href="https://github.com/topics/beginner-friendly" rel="noopener noreferrer"&gt;beginner-friendly&lt;/a&gt;, &lt;a href="https://github.com/topics/easy" rel="noopener noreferrer"&gt;easy&lt;/a&gt;, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ways to contribute to open source
&lt;/h2&gt;

&lt;p&gt;Contributing to an open-source project doesn’t necessarily mean that you need to provide exclusive code for the project, you can contribute to a project in many ways. You can make a contribution by making comments on existing code and &lt;a href="https://aviyel.com/post/78/say-hello-to-hoppscotch-our-first-open-source-project-on-aviyel" rel="noopener noreferrer"&gt;APIs&lt;/a&gt; to add context or by writing documentation for the project. If you like to code, you can open a pull request to provide your code contribution or even open an issue to discuss and get help on a new feature or an issue.&lt;/p&gt;

&lt;p&gt;If you don’t want to contribute to existing projects, you can even create your own open-source project which might also serve as an alternative to commercial software.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5pgug12v0qvwdvllevt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5pgug12v0qvwdvllevt.png" alt="Ways to contribute to opensource"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for a successful contribution to open source
&lt;/h2&gt;

&lt;p&gt;Projects generally list the work that needs to be done and to build up your confidence and credibility you should start with the easiest and smallest contributions first that take the least amount of work. Read documentation related to the task to get a better understanding of what to do and always try to reach out to the community to ask for help, clarification, or mentorship. Once you’re confident enough on a task and know how to go about it, write some code and submit a pull request. Submit your work as per the contribution guidelines and if all goes well, you shall become an active open-source contributor in no time!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdr0rzqntvo41vbahuu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdr0rzqntvo41vbahuu1.png" alt="GitHub Pull Request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Go ahead and get started!
&lt;/h2&gt;

&lt;p&gt;Contributing to an open-source project can be an amazing learning experience since it allows you to be a part of a great community and also helps in developing your technical skills especially since you do not have to know every little detail about a project to make a contribution. So, what are you waiting for? Pick up a project and a community that supports new contributors, and get started with your contributions.&lt;/p&gt;

&lt;p&gt;Thanks for reading. I hope you find this article helpful !!&lt;/p&gt;

&lt;p&gt;This blog was originally posted on &lt;a href="https://aviyel.com/post/946/open-source-community-how-to-become-an-active-contributor" rel="noopener noreferrer"&gt;this website&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to comment, share and reach out to me on &lt;a href="https://hashnode.com/@saharshlaud" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://in.linkedin.com/in/saharsh-laud" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>opensource</category>
      <category>contribution</category>
      <category>github</category>
      <category>community</category>
    </item>
    <item>
      <title>Build long-lasting customer relations through Chatwoot, the ultimate opensource customer engagement suite.</title>
      <dc:creator>Saharsh Laud</dc:creator>
      <pubDate>Wed, 11 Aug 2021 11:47:49 +0000</pubDate>
      <link>https://dev.to/saharshlaud/build-long-lasting-customer-relations-through-chatwoot-the-ultimate-opensource-customer-engagement-suite-4518</link>
      <guid>https://dev.to/saharshlaud/build-long-lasting-customer-relations-through-chatwoot-the-ultimate-opensource-customer-engagement-suite-4518</guid>
      <description>&lt;p&gt;With the massive upsurge in the online consumer market, it has become an essential factor for businesses to provide proper customer services and ensure that the queries of the customer are properly handled.&lt;/p&gt;

&lt;p&gt;If you are selling a product online, then it is a combined effort of your product quality as well as the customer support provided, that defines the entire user experience. &lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 Principles of Exceptional Customer Experience
&lt;/h2&gt;

&lt;p&gt;Let us take a brief look at the 4 important principles of Exceptional Customer Experience:&lt;br&gt;
&lt;strong&gt;1. Be where the customers are&lt;/strong&gt;&lt;br&gt;
This principle conveys that there should always be some kind of contextual in-product help whenever possible so that first-time users have an idea of how to go about using your product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Making it easy to find answers&lt;/strong&gt;&lt;br&gt;
This is probably the most important principle since most of the businesses that lose their customers are due to the unavailability of a system to provide and quick and efficient solutions to the customer's queries. Thus, the speed of customer engagement is a major factor in defining the entire experience for the customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Consistency and compassion&lt;/strong&gt;&lt;br&gt;
The key principle of building long-term customer relations is that each customer should be treated with the same compassion and consistency, their problems must be listened to and addressed properly by the customer service team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Closed-loop feedback&lt;/strong&gt;&lt;br&gt;
This final principle makes use of the customer's problems to drive new innovations and changes in the product thereby helping in the overall growth of the organization.&lt;/p&gt;

&lt;p&gt;Tony Hsieh, the American Internet entrepreneur, and venture capitalist believed customer service to be extremely important for any business stating, "&lt;strong&gt;Customer service should not be a department. It should be the entire company&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;With that being said, it is quite evident that a customer engagement platform is highly needed by any business organization so as to provide a better way to talk to the customers, build a relationship and make it easier for them to reach out to the organization from anywhere at any time. &lt;/p&gt;

&lt;p&gt;Fortunately, &lt;a href="https://www.chatwoot.com/" rel="noopener noreferrer"&gt;Chatwoot&lt;/a&gt; has come to our rescue by providing an open-source platform for managing all customer engagement and relationship goals from a single place.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why prefer Chatwoot over other alternatives?
&lt;/h2&gt;

&lt;p&gt;Chatwoot has gained massive popularity in recent years over its alternatives such as Intercom, Zendesk &amp;amp; Salesforce Service Cloud.&lt;br&gt;
What makes Chatwoot stand apart from the other competitors is the fact that it is loaded with a huge array of features to provide a seamless user experience. Let us take a look at some of the major features that Chatwoot offers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Open-source&lt;/strong&gt;&lt;br&gt;
Being an open-source project is one of the major features of Chatwoot which surely makes it stand out from the crowd. Unlike other customer service software in the market, the open-source feature of Chatwoot allows you to have complete access to their codebase so that you can customize and extend Chatwoot to suit your business needs or even contribute towards the project itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Live chat&lt;/strong&gt;&lt;br&gt;
The rapidly growing popularity of live chat has made it a "must-have" communication tool for any business. Most of the customers today &lt;strong&gt;prefer to chat&lt;/strong&gt; with someone in real-time and online, rather than call a company for support. It is expected that by the year 2022 about 85% of the businesses (&lt;a href="https://99firms.com/blog/live-chat-statistics/#gref" rel="noopener noreferrer"&gt;Source&lt;/a&gt;) will opt for live chat support. Using Chatwoot, you can start providing live chat features right away through customizable widgets based on your product, brand, language, etc. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Chatbots&lt;/strong&gt;&lt;br&gt;
Chatbots are probably one of the most useful applications of AI and they can really boost the performance of the customer service team. A report by PSFK stated that &lt;a href="https://www.psfk.com/2018/05/primary-research-chat-customer-service.html" rel="noopener noreferrer"&gt;74% of consumers prefer chatbots&lt;/a&gt; when they’re looking for instant answers. Chatwoot provides easy integration with popular chatbot platforms such as Rasa and Dialogflow so that your agents are not burdened with a bulk load of queries and at the same time there can be seamless handoff of conversations whenever necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Shared inboxes&lt;/strong&gt;&lt;br&gt;
Chatwoot allows you to access and connect multiple communication channels like Email, Facebook Page, Twitter, WhatsApp, etc so that you can effortlessly communicate with both the customers as well as your team from a single location. The &lt;strong&gt;canned response&lt;/strong&gt; feature allows you to respond faster by accessing the saved replies to frequently asked questions using slash commands. You can also use private notes and &lt;strong&gt;@mentions&lt;/strong&gt; for sharing information within the team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Mobile app&lt;/strong&gt;&lt;br&gt;
In today's world everything needs to be available on your mobile device and so is Chatwoot! With Chatwoot's mobile app available for both Android and iOS, you can manage your conversations on the go and keep your customers satisfied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Other features&lt;/strong&gt;&lt;br&gt;
Some other great features of Chatwoot are mentioned below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrations:&lt;/strong&gt; Apart from integrations with chatbot platforms, you can also integrate Chatwoot with applications such as Slack, Calendly, WordPress, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual Support:&lt;/strong&gt; With the support for more than 10 different languages you can reach out to customers as per their preferred language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto Assignment:&lt;/strong&gt; Based on the availability and load, the system intelligently assigns a ticket to the agents with access to the inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversation Continuity:&lt;/strong&gt; Chatwoot allows you to easily continue conversations from the chat widget to other communication mediums. Suppose the user provides an email address through the chat widget, Chatwoot would send an email to the customer under the agent name to continue the conversation over the email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful API &amp;amp; Webhook:&lt;/strong&gt; Chatwoot allows for extensive customization and you can further extend the software's capability using Chatwoot's webhooks and APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports:&lt;/strong&gt; Chatwoot's dashboard provides excellent reporting features with pre-build metrics like incoming messages, resolution time, resolution count, etc. This way you can easily audit things, know how your customers are responding, and even generate a customer satisfaction report. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Getting started with Chatwoot
&lt;/h2&gt;

&lt;p&gt;Now you might be wondering that Chatwoot is an excellent choice for a customer engagement tool but how does one get started with using Chatwoot for their business? Deploying Chatwoot is actually a pretty simple task and you can easily deploy it on &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/heroku" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;, &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/caprover" rel="noopener noreferrer"&gt;Caprover&lt;/a&gt;, &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;, &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/clevercloud" rel="noopener noreferrer"&gt;Clever Cloud&lt;/a&gt;, or &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/linux-vm" rel="noopener noreferrer"&gt;Linux&lt;/a&gt; by following a few simple steps. &lt;br&gt;
Today we shall see Chatwoot deployment on Heroku.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deploying Chatwoot on Heroku
&lt;/h3&gt;

&lt;p&gt;By just following the steps mentioned below, you can easily set up Chatwoot within no time.&lt;br&gt;
&lt;strong&gt;Step 1: Set up Heroku account&lt;/strong&gt;&lt;br&gt;
The first and foremost requirement for Chatwoot deployment is a Heroku account. Heroku provides a wide range of functionalities in its free suite and you can easily set up your account by clicking on the &lt;a href="https://signup.heroku.com" rel="noopener noreferrer"&gt;Signup&lt;/a&gt; button and following the instructions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frh6h8ddg1yqmf1tl8jlj.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frh6h8ddg1yqmf1tl8jlj.JPG" alt="Heroku Signup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: One-click Chatwoot deployment&lt;/strong&gt;&lt;br&gt;
The Chatwoot team has developed a one-click Heroku deployment option for users. You can either head to the official Chatwoot repository on GitHub to access the &lt;a href="https://heroku.com/deploy?template=https://github.com/chatwoot/chatwoot/tree/master" rel="noopener noreferrer"&gt;one-click deployment button&lt;/a&gt; or even go through the deployment &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/heroku" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for the same.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft578kryem2u2zjc6l6hv.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft578kryem2u2zjc6l6hv.JPG" alt="One-click deployment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Provide application details&lt;/strong&gt;&lt;br&gt;
Once you click on the deployment button, you will be redirected to the basic app configuration page on Heroku, most of which is already provided by Chatwoot. All you need to provide is the &lt;strong&gt;App name&lt;/strong&gt;, &lt;strong&gt;Region&lt;/strong&gt;, and the &lt;strong&gt;Frontend URL&lt;/strong&gt; (which mostly contains the app name).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgpuwhafga4ee9uv8kr5.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgpuwhafga4ee9uv8kr5.JPG" alt="App Configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: App Deployment&lt;/strong&gt;&lt;br&gt;
After configuring the Chatwoot app details, simply click on the &lt;strong&gt;Deploy App&lt;/strong&gt; button to deploy your application on Heroku. The deployment can take 5-10 minutes so wait until the entire deployment process is completed.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8oe097daqqdlt87a9fk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8oe097daqqdlt87a9fk.png" alt="Successful Deployment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Open your app&lt;/strong&gt;&lt;br&gt;
After deployment of the Chatwoot app, you can easily access it using the Frontend URL provided in Step 3. You will be redirected to a registration page. Before registering, let us set up the SMTP server and other configurations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pczkg51irj8vjrdyods.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pczkg51irj8vjrdyods.JPG" alt="Chatwoot Registration Page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting up Environment Variables for Chatwoot
&lt;/h3&gt;

&lt;p&gt;Before configuring the environment variables for storage and email server, head to the Resources tab in the Heroku app dashboard and make sure that the worker dynos are turned on. Now head over to the settings tabs and click "&lt;strong&gt;reveal config vars&lt;/strong&gt;" to configure the various environment variables.&lt;/p&gt;
&lt;h4&gt;
  
  
  Configuring Storage -
&lt;/h4&gt;

&lt;p&gt;Chatwoot uses the local storage on your server by default but you can change it to use any of the cloud service providers like Amazon s3, Google GCS, Microsoft Azure, etc.&lt;br&gt;
In order to configure the Cloud Storage service, you'll have to modify the "&lt;strong&gt;ACTIVE_STORAGE_SERVICE&lt;/strong&gt;" variable and after that, you can refer to &lt;a href="https://www.chatwoot.com/docs/self-hosted/deployment/storage/supported-providers" rel="noopener noreferrer"&gt;configuring cloud storage&lt;/a&gt; for additional environment variables required according to the cloud service provider.&lt;/p&gt;
&lt;h4&gt;
  
  
  Configuring SMTP -
&lt;/h4&gt;

&lt;p&gt;In order to configure the SMTP server, you'll have to work with the following variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  MAILER_SENDER_EMAIL&lt;/li&gt;
&lt;li&gt;  SMTP_ADDRESS&lt;/li&gt;
&lt;li&gt;  SMTP_USERNAME&lt;/li&gt;
&lt;li&gt;  SMTP_PASSWORD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use any SMTP service provider such as SendGrid, Amazon SES, MailGun, Mandril, etc. Below shown is a sample for environment variable and their values when SMTP is used via SendGrid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SMTP_ADDRESS = smtp.sendgrid.net
SMTP_AUTHENTICATION = plain
SMTP_DOMAIN = &amp;lt;your verified domain&amp;gt;
SMTP_ENABLE_STARTTLS_AUTO = true
SMTP_PORT = 587
SMTP_USERNAME = apikey
SMTP_PASSWORD = &amp;lt;your Sendgrid API key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find the syntax for other environment variables also on Chatwoot's official &lt;a href="https://www.chatwoot.com/docs/self-hosted/configuration/environment-variables" rel="noopener noreferrer"&gt;documentation page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After you've successfully set up the required environment variables and the Heroku app is redeployed with the implemented changes, you can go ahead and register a new account on Chatwoot.&lt;/p&gt;

&lt;p&gt;You shall receive a confirmation mail on the email id used which confirms that the SMTP server is properly running for your Chatwoot app. Confirm your email id and set a new password when prompted. You are now all set to use the functionalities of Chatwoot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4q0z4r8rium4ik8en24.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4q0z4r8rium4ik8en24.JPG" alt="Chatwoot Confirmation email"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Chatwoot Inbox
&lt;/h3&gt;

&lt;p&gt;Now that you are done with the deployment process, we can move ahead and create a new inbox. A Chatwoot inbox is basically a type of channel and you can connect your various communication sources such as Email, Website, Facebook Page, Twitter, WhatsApp, etc, and talk to your customers from one place.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqggehora4y59p7b0lk6.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqggehora4y59p7b0lk6.JPG" alt="Chatwoot Dashboard"&gt;&lt;/a&gt;&lt;br&gt;
Let us see how you can create a customized inbox for your website:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; In the Chatwoot dashboard, click on the Inboxes tab on the left panel and then click on Add Inbox button (or simply click on the + icon next to the Inboxes tab).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvo3pphgk999e5vdglgk.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvo3pphgk999e5vdglgk.JPG" alt="Add Inbox Option"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Select the channel that you want to select for the Inbox. Here we shall select the Website option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwn36u86l0zoevrjbu8f.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwn36u86l0zoevrjbu8f.JPG" alt="Selecting Channel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Customize the inbox by firstly providing the website name and domain and then selecting the other customizations such as Widget color, Welcome heading, Welcome tagline, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbjvfbzfgvzqp81it8vl.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbjvfbzfgvzqp81it8vl.JPG" alt="Customizing Inbox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; After that, you'll have to add agents who will have access to this particular inbox.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dy9x9nuoq19wujnvo6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dy9x9nuoq19wujnvo6v.png" alt="Adding Agents"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; The next page will show you some JavaScript code that you need to include in your website for the widget to run. Just copy the code shown and paste it into your website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kk7zvzijtr87s9402c0.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kk7zvzijtr87s9402c0.JPG" alt="Javascript Code for widget"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this, your inbox is up and running. You can notice that a Chatwoot widget appears on your page now and you have successfully added Chatwoot support to your website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumhz8ukb11gqlenh5051.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumhz8ukb11gqlenh5051.png" alt="Chatwoot Widget"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Through this widget, your customers can now perform real-time chat with the agent assigned and get proper solutions to their queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnquylldk19mteg2olatx.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnquylldk19mteg2olatx.JPG" alt="Chatwoot inbox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Chatwoot Agents
&lt;/h3&gt;

&lt;p&gt;You can also manage your agents through the Chatwoot dashboard by assigning them with a particular inbox and also specifying their roles.&lt;/p&gt;

&lt;p&gt;The following roles define the type of access to Chatwoot's features:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent&lt;/strong&gt; - Agents with this role have access to inboxes, reports, and conversations. They can resolve conversations by assigning conversations to other agents or solving themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Administrator&lt;/strong&gt; - Administrators have access to all the features of Chatwoot enabled for their account, including settings, along with all the privileges of a normal agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90dww6modqt2fepqzqlz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90dww6modqt2fepqzqlz.png" alt="Adding new Agent"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a detailed video that might help you to understand the entire deployment process of Chatwoot more precisely:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/iN2Dl0QkvEg"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Start redefining your customer service experience today!
&lt;/h2&gt;

&lt;p&gt;Customer engagement can be a great deal of work if not managed properly and can even lead to the downfall of any organization. With the help of Chatwoot, anyone can easily set up customer support for their own business through a single powerful dashboard and manage customer interactions related to multiple services. &lt;br&gt;
Now, what are you waiting for? Go ahead and use the power of Chatwoot to take your business to the next level.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Closing,
&lt;/h2&gt;

&lt;p&gt;This was all about Chatwoot, its amazing features, and the deployment process. I hope that this article was helpful for you. Please feel free to reach out and connect with me anytime.&lt;/p&gt;

</description>
      <category>chatwoot</category>
      <category>customersupport</category>
      <category>opensource</category>
      <category>customerengagement</category>
    </item>
  </channel>
</rss>
