Cartoon Filter Using OpenCV and Python

Introduction

Hello! In this tutorial I will show how to apply a simply cartoon filter on any image


Preparing the environment

First we need to initiate the python virtual environment which can be done via:

python3 <span>-m</span> venv <span>env source env</span>/bin/activate
python3 <span>-m</span> venv <span>env source env</span>/bin/activate
python3 -m venv env source env/bin/activate

Enter fullscreen mode Exit fullscreen mode


Installing the dependencies

Create a requirements.txt file and add the following:

<span># requirements.txt</span>
opencv-python
<span># requirements.txt</span>
opencv-python
# requirements.txt opencv-python

Enter fullscreen mode Exit fullscreen mode

Then install via:

pip <span>install</span> <span>-r</span> requirements.txt
pip <span>install</span> <span>-r</span> requirements.txt
pip install -r requirements.txt

Enter fullscreen mode Exit fullscreen mode


Writing the source code

Importing the neccessary modules

<span>import</span> <span>argparse</span>
<span>import</span> <span>cv2</span>
<span>import</span> <span>argparse</span>
<span>import</span> <span>cv2</span>
import argparse import cv2

Enter fullscreen mode Exit fullscreen mode

Writing the function to apply the cartoon effect

<span>def</span> <span>cartoonize</span> <span>(</span><span>image</span><span>):</span>
<span>gray</span> <span>=</span> <span>cv2</span><span>.</span><span>cvtColor</span><span>(</span><span>image</span><span>,</span> <span>cv2</span><span>.</span><span>COLOR_BGR2GRAY</span><span>)</span>
<span>blurImage</span> <span>=</span> <span>cv2</span><span>.</span><span>medianBlur</span><span>(</span><span>image</span><span>,</span> <span>1</span><span>)</span>
<span>edges</span> <span>=</span> <span>cv2</span><span>.</span><span>adaptiveThreshold</span><span>(</span><span>gray</span><span>,</span> <span>255</span><span>,</span> <span>cv2</span><span>.</span><span>ADAPTIVE_THRESH_MEAN_C</span><span>,</span> <span>cv2</span><span>.</span><span>THRESH_BINARY</span><span>,</span> <span>9</span><span>,</span> <span>9</span><span>)</span>
<span>color</span> <span>=</span> <span>cv2</span><span>.</span><span>bilateralFilter</span><span>(</span><span>image</span><span>,</span> <span>9</span><span>,</span> <span>200</span><span>,</span> <span>200</span><span>)</span>
<span>cartoon</span> <span>=</span> <span>cv2</span><span>.</span><span>bitwise_and</span><span>(</span><span>color</span><span>,</span> <span>color</span><span>,</span> <span>mask</span> <span>=</span> <span>edges</span><span>)</span>
<span>return</span> <span>cartoon</span>
<span>def</span> <span>cartoonize</span> <span>(</span><span>image</span><span>):</span>
  <span>gray</span> <span>=</span> <span>cv2</span><span>.</span><span>cvtColor</span><span>(</span><span>image</span><span>,</span> <span>cv2</span><span>.</span><span>COLOR_BGR2GRAY</span><span>)</span>
  <span>blurImage</span> <span>=</span> <span>cv2</span><span>.</span><span>medianBlur</span><span>(</span><span>image</span><span>,</span> <span>1</span><span>)</span>

  <span>edges</span> <span>=</span> <span>cv2</span><span>.</span><span>adaptiveThreshold</span><span>(</span><span>gray</span><span>,</span> <span>255</span><span>,</span> <span>cv2</span><span>.</span><span>ADAPTIVE_THRESH_MEAN_C</span><span>,</span> <span>cv2</span><span>.</span><span>THRESH_BINARY</span><span>,</span> <span>9</span><span>,</span> <span>9</span><span>)</span>

  <span>color</span> <span>=</span> <span>cv2</span><span>.</span><span>bilateralFilter</span><span>(</span><span>image</span><span>,</span> <span>9</span><span>,</span> <span>200</span><span>,</span> <span>200</span><span>)</span>

  <span>cartoon</span> <span>=</span> <span>cv2</span><span>.</span><span>bitwise_and</span><span>(</span><span>color</span><span>,</span> <span>color</span><span>,</span> <span>mask</span> <span>=</span> <span>edges</span><span>)</span>

  <span>return</span> <span>cartoon</span>
def cartoonize (image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurImage = cv2.medianBlur(image, 1) edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9) color = cv2.bilateralFilter(image, 9, 200, 200) cartoon = cv2.bitwise_and(color, color, mask = edges) return cartoon

Enter fullscreen mode Exit fullscreen mode

This function basically takes an image and applies a cartoonish style filter to the image which is then returned.
Median blue is most effective when it comes to reducing the noise from the image.
Adaptive Thresholding is used to overcome false predictions and illumination problems with the image.
Bilateral filter is a edge preserving and smoothing filter for images.
Finally we apply the filter onto the image via bitwise_and.

Finally we need to write the main function

<span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span>
<span>ap</span> <span>=</span> <span>argparse</span><span>.</span><span>ArgumentParser</span><span>()</span>
<span>ap</span><span>.</span><span>add_argument</span><span>(</span><span>"</span><span>-i</span><span>"</span><span>,</span> <span>"</span><span>--image</span><span>"</span><span>,</span> <span>required</span> <span>=</span> <span>True</span><span>,</span> <span>help</span> <span>=</span> <span>"</span><span>Path to input file</span><span>"</span><span>)</span>
<span>args</span> <span>=</span> <span>vars</span><span>(</span><span>ap</span><span>.</span><span>parse_args</span><span>())</span>
<span>image</span> <span>=</span> <span>cv2</span><span>.</span><span>imread</span><span>(</span><span>args</span><span>[</span><span>"</span><span>image</span><span>"</span><span>])</span>
<span>cartoonImage</span> <span>=</span> <span>cartoonize</span><span>(</span><span>image</span><span>)</span>
<span>cv2</span><span>.</span><span>imwrite</span><span>(</span><span>"</span><span>output.jpg</span><span>"</span><span>,</span> <span>cartoonImage</span><span>)</span>
<span>cv2</span><span>.</span><span>imshow</span><span>(</span><span>"</span><span>output</span><span>"</span><span>,</span> <span>cartoonImage</span><span>)</span>
<span>cv2</span><span>.</span><span>waitKey</span><span>(</span><span>0</span><span>)</span>
<span>cv2</span><span>.</span><span>destroyAllWindows</span><span>()</span>
<span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span>
  <span>ap</span> <span>=</span> <span>argparse</span><span>.</span><span>ArgumentParser</span><span>()</span>
  <span>ap</span><span>.</span><span>add_argument</span><span>(</span><span>"</span><span>-i</span><span>"</span><span>,</span> <span>"</span><span>--image</span><span>"</span><span>,</span> <span>required</span> <span>=</span> <span>True</span><span>,</span> <span>help</span> <span>=</span> <span>"</span><span>Path to input file</span><span>"</span><span>)</span>
  <span>args</span> <span>=</span> <span>vars</span><span>(</span><span>ap</span><span>.</span><span>parse_args</span><span>())</span>

  <span>image</span> <span>=</span> <span>cv2</span><span>.</span><span>imread</span><span>(</span><span>args</span><span>[</span><span>"</span><span>image</span><span>"</span><span>])</span>

  <span>cartoonImage</span> <span>=</span> <span>cartoonize</span><span>(</span><span>image</span><span>)</span>

  <span>cv2</span><span>.</span><span>imwrite</span><span>(</span><span>"</span><span>output.jpg</span><span>"</span><span>,</span> <span>cartoonImage</span><span>)</span>
  <span>cv2</span><span>.</span><span>imshow</span><span>(</span><span>"</span><span>output</span><span>"</span><span>,</span> <span>cartoonImage</span><span>)</span>

  <span>cv2</span><span>.</span><span>waitKey</span><span>(</span><span>0</span><span>)</span>
  <span>cv2</span><span>.</span><span>destroyAllWindows</span><span>()</span>
if __name__ == "__main__": ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True, help = "Path to input file") args = vars(ap.parse_args()) image = cv2.imread(args["image"]) cartoonImage = cartoonize(image) cv2.imwrite("output.jpg", cartoonImage) cv2.imshow("output", cartoonImage) cv2.waitKey(0) cv2.destroyAllWindows()

Enter fullscreen mode Exit fullscreen mode

What we do here is basically parse the image argument from the command line, apply the cartoon filter and then write the output to file and then show the output to the user.
After that we listen for any key and then cleanup the window.


Running the program

The program can be run via:

python main.py <span>-i</span> original.jpg
python main.py <span>-i</span> original.jpg
python main.py -i original.jpg

Enter fullscreen mode Exit fullscreen mode

If all goes well you should see the following output:

The sample image was taken from my home town in the UK.


Conclusion

Here I have demonstrated how to apply a simple cartoon like filter to an image, feel free to experiment with your own images are even expand it to include more filters.

Happy Coding!


Like me work? I post about a variety of topics, if you would like to see more please like and follow me.
Also I love coffee.

原文链接:Cartoon Filter Using OpenCV and Python

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
I may not be perfect but at least I’m not fake.
我可能不完美,但是我至少不虚伪
评论 抢沙发

请登录后发表评论

    暂无评论内容