官术网_书友最值得收藏!

Using an optimized version of a Gaussian blur

A Gaussian blur is basically a convolution with a Gaussian function. Well, one of the features of convolutions is their associative property. This means that it does not matter whether we first invert the image and then blur it, or first blur the image and then invert it.

If we start with a blurred image and pass its inverse to the dodge function, then within that function the image will be inverted again (the 255-mask part), essentially yielding the original image. If we get rid of these redundant operations, the optimized convert_to_pencil_sketch function will look like this:

def convert_to_pencil_sketch(rgb_image):
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
blurred_image = cv2.GaussianBlur(gray_image, (21, 21), 0, 0)
gray_sketch = cv2.divide(gray_image, blurred_image, scale=256)
return cv2.cvtColor(gray_sketch, cv2.COLOR_GRAY2RGB)

For kicks and giggles, we want to lightly blend our transformed image (img_sketch) with a background image (canvas) that makes it look as though we drew the image on a canvas. So, before returning, we would like to blend with canvas if it exists:

    if canvas is not None:
gray_sketch = cv2.multiply(gray_sketch, canvas, scale=1 / 256)

We name our final function pencil_sketch_on_canvas, and it looks like this (together with optimizations):

def pencil_sketch_on_canvas(rgb_image, canvas=None):
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
blurred_image = cv2.GaussianBlur(gray_image, (21, 21), 0, 0)
gray_sketch = cv2.divide(gray_image, blurred_image, scale=256)
if canvas is not None:
gray_sketch = cv2.multiply(gray_sketch, canvas, scale=1 / 256)
return cv2.cvtColor(gray_sketch, cv2.COLOR_GRAY2RGB)

This is just our convert_to_pencil_sketch function, with the optional canvas argument that can add an artistic touch to the pencil sketch.

And we're done! The final output looks like this:

Let's take a look at how to generate a warming and cooling filter in the next section, where you'll learn how to use lookup tables for image manipulation.

主站蜘蛛池模板: 磐石市| 泾阳县| 卢氏县| 怀仁县| 东港市| 河间市| 青河县| 呼伦贝尔市| 青田县| 黄大仙区| 新宁县| 晋州市| 永平县| 原平市| 天等县| 邯郸县| 常德市| 安龙县| 昌平区| 黄平县| 金昌市| 高碑店市| 乐平市| 监利县| 武鸣县| 都昌县| 辰溪县| 双牌县| 南充市| 理塘县| 北海市| 简阳市| 大竹县| 花垣县| 潜山县| 亳州市| 南陵县| 鄂托克旗| 博野县| 四子王旗| 娄底市|