思想:借助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)