opencv python 显示正梯度和负梯度

该文介绍了如何使用OpenCV库进行图像处理,包括将图像转换到HSV色彩空间,创建白色颜色范围的掩模,应用灰度和Viridis色图。接着,文章展示了Sobel算子计算梯度的方法,比较了仅显示正梯度和正负梯度的差异,使用色彩映射可视化这些梯度效果。
摘要由CSDN通过智能技术生成

思想:借助colormap

先来一个例子,学一学colormap和mask的联合使用

import cv2
import numpy as np
from skimage.exposure import rescale_intensity

img = cv2.imread('penguin.jpg') #Read in image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #Change to HSV

# define range of white color in HSV
lower_white = np.array([0,0,210])
upper_white = np.array([255,255,255])

mask = cv2.inRange(hsv, lower_white, upper_white) # Create the mask 得到mask还是简单的

# Y = 0.299 R + 0.587 G + 0.114 B
# convert [0,0,210] to intensity = 0.299*210 = 63
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Change to gray (intensity)
gray = rescale_intensity(gray, in_range=(63,255), out_range=(0,255)).astype(np.uint8) # linearly stretch 63 to black and 255 to white
# 得到灰度图,简单



colormap = cv2.applyColorMap(gray, cv2.COLORMAP_VIRIDIS) #Viridis Colormap to gray image

img_masked = cv2.bitwise_and(img, img, mask=mask) # Apply mask to img, mask里面的用原图

colormap_masked = cv2.bitwise_and(colormap, colormap, mask=(255-mask)) #  mask外面的用灰度图

result = cv2.add(img_masked, colormap_masked) # Merge original and colormapped using mask

#Display and write image
cv2.imwrite('penguin_mask.jpg', mask)  # inrange 得到的,简单
cv2.imwrite('penguin_colormapped2.jpg', colormap) # 灰度图映射出来的,简单
cv2.imwrite('penguin_result.jpg', result)

cv2.imshow('mask', mask)
cv2.imshow('colormapped2', colormap)
cv2.imshow('result', result)
cv2.waitKey()

 

有了前面的这个基础我们,就可以对比 sobel梯度里面 只显示正梯度和正负梯度多显示的不同代码了。

 

 

img = load('images\\brick.jpg')
    image_grey = greyscale(img)

    sobel_hori = np.array(
        [
            [1, 0, -1],
            [2, 0, -2],
            [1, 0, -1]
        ])
    sobel_verti = np.array(
        [
            [1, 2, 1],
            [0, 0, 0],
            [-1, -2, -1]
        ])
    resized = resize(image_grey, 0.5, 0.5)
    im_sobel_ver = conv2D(resized, sobel_verti)
    im_sobel_hor = conv2D(resized, sobel_hori)
    im_sobel_all = im_sobel_ver * im_sobel_ver + im_sobel_hor * im_sobel_hor
    im_sobel_all = np.sqrt(im_sobel_all)
    display(im_sobel_all, "sobel all direction magnitude sqrt of dx*dx + dy*dy")



    # Compute the gradient using the Scharr operator
    grad_x = im_sobel_hor
    grad_y = im_sobel_ver
    grad_add = grad_x + grad_y
    grad_mag = np.sqrt(grad_x ** 2 + grad_y ** 2)

    print(np.min(grad_add), np.max(grad_add))
    n = np.min(grad_add)
    m = np.max(grad_add)

    pn_cmap = cv2.applyColorMap(np.uint8(255 * (grad_add-n) / (m-n)), cv2.COLORMAP_VIRIDIS)
    cv2.imshow('Positive Gradients and negative gra', cv2.resize(pn_cmap, dsize = None, fx=3, fy=3))

    grad_add_clip = np.clip(grad_mag, 0, m)
    ponly_cmap = cv2.applyColorMap(np.uint8(255 * (grad_add - 0) / m), cv2.COLORMAP_VIRIDIS)
    cv2.imshow('only right', cv2.resize(ponly_cmap, dsize = None, fx=3, fy=3))
    cv2.waitKey(0)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值