DEV Community

Cover image for Oil Paint Effect With OpenCV Python
Dennis O'Keeffe
Dennis O'Keeffe

Posted on • Originally published at blog.dennisokeeffe.com

Oil Paint Effect With OpenCV Python

I write content for AWS, Kubernetes, Python, JavaScript and more. To view all the latest content, be sure to visit my blog and subscribe to my newsletter. Follow me on Twitter.

This is Day 25 of the #100DaysOfPython challenge.

This post will use the OpenCV Python library to apply an oil painting effect to an image.

Prerequisites

  1. Familiarity with Pipenv. See here for my post on Pipenv.
  2. An image to use with the OpenCV library.

Getting started

Let's create the oil-paint-effect-with-open-cv-python directory and install Pillow.

# Make the `oil-paint-effect-with-open-cv-python` directory
$ mkdir oil-paint-effect-with-open-cv-python
$ cd oil-paint-effect-with-open-cv-python
$ touch main.py

# Init the virtual environment
$ pipenv --three
$ pipenv install opencv-python opencv-contrib-python


# if you have issues with a hanging lockfile, try add the --skip-lock option
Enter fullscreen mode Exit fullscreen mode

At this stage, you will need to add an image to the root of your directory. In my case, I will add base_img.jpg to the directory (which will be an image from Unsplash).

We are now ready to start coding!

Applying the oil painting effect

This section simply loads the image in var base_img (assuming you are following the directory structure where the notebook is in the docs folder).

import cv2
img = cv2.imread('./base_img.jpg')
Enter fullscreen mode Exit fullscreen mode

Once that is complete, we can apply the oil paiting effect with one liner of code:

res = cv2.xphoto.oilPainting(img, 7, 1)
Enter fullscreen mode Exit fullscreen mode

We can now compare by displaying the images:

cv2.imshow("original", img)
cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
Enter fullscreen mode Exit fullscreen mode

This will display the images in a window.

The original image:

Original

After applying the effect:

After effect

When you are finished with viewing, hit escape to exit.

Summary

Today's post demonstrated how to use the OpenCV package to programmatically apply an oil painting effect to an image.

Resources and further reading

  1. The ABCs of Pipenv
  2. OpenCV Python library
  3. Pipenv

Photo credit: dancristianp

Originally posted on my blog. To see new posts without delay, read the posts there and subscribe to my newsletter.

Top comments (1)

Collapse
 
nityanand_chandrakar_97a5 profile image
NITYANAND Chandrakar

Image description # Retry the oil painting effect using an alternative OpenCV approach

The cv2.xphoto module might not be available; using bilateral filters as a workaround for the effect

def apply_oil_painting_alternative(image_path, output_path):
# Read the input image
image = cv2.imread(image_path)

# Apply bilateral filters repeatedly to achieve a painterly effect
oil_painting = image.copy()
for _ in range(3): # Repeating for a stronger effect
oil_painting = cv2.bilateralFilter(oil_painting, d=9, sigmaColor=75, sigmaSpace=75)

Save the result

cv2.imwrite(output_path, oil_painting)
return output_path

Enter fullscreen mode Exit fullscreen mode




Apply the effect and save the result

output_image_path = "/mnt/data/oil_painting_effect_alternative.png"
apply_oil_painting_alternative(input_image_path, output_image_path)