如何通过调整RGB值编码自定义灰度滤镜?

问题描述

我正在尝试创建一个灰度滤镜,允许您调整图像中所有像素的RGB百分比,例如(红色= 20%,绿色= 70%,蓝色= 10%)。我宁愿在基本级别上执行此操作,因此只需要使用公式就可以实现最少的转换。

我认为代码看起来像这样:

import numpy as np
import cv2
img=cv2.imread(filepath)
imgBlue=img[:,:,0]
imgGreen=[:,1]
imgRed=[:,2]
blueCon=imgBlue*.1
greenCon=imgGreen*.7
redCon=imgRed*.2
greyscaledImg=img[:,:]
greyscaledImg[:,0]=blueCon
greyscaledImg[:,1]=greenCon
greyscaledImg[:,2]=redCon
cv2.imwrite(filepath,greyscaledImg)

解决方法

使用OpenCV的跟踪栏可能是一个很好的示例,请参见this example

但是,我认为所提出的灰度滤镜概念不会那样工作,因为您只是线性缩放整个图像的RGB值。为了获得灰色调,您需要分别处理图像中的所有像素。

尽管如此,以下示例中还是内置了您的概念:

import cv2

# Setup maximum factors for each channel
r_max = 100
g_max = 100
b_max = 100

# Window title
title_window = 'Custom gray scale'


# Event for R trackbar change
def on_r_trackbar(val):
    dst[:,:,2] = val / r_max * src[:,2]
    cv2.imshow(title_window,dst)


# Event for G trackbar change
def on_g_trackbar(val):
    dst[:,1] = val / g_max * src[:,1]
    cv2.imshow(title_window,dst)


# Event for B trackbar change
def on_b_trackbar(val):
    dst[:,0] = val / b_max * src[:,0]
    cv2.imshow(title_window,dst)


# Read some input image
src = cv2.imread('path/to/your/image.png')
dst = src.copy()

# Setup window and create trackbars for each channel
cv2.namedWindow(title_window)
cv2.createTrackbar('R',title_window,100,r_max,on_r_trackbar)
cv2.createTrackbar('G',g_max,on_g_trackbar)
cv2.createTrackbar('B',b_max,on_b_trackbar)

# Show something,and wait until user presses some key
cv2.imshow(title_window,dst)
cv2.waitKey()

这是窗口最初的样子:

1

然后,设置您的值,即可得到:

2

因此,为了获得一些灰色外观,我会坚持使用HSV color space,并只需修改饱和度通道即可:

import cv2

# Setup maximum factor for the saturation
s_max = 100

# Window title
title_window = 'Custom gray scale'


# Event for S (saturation) trackbar change
def on_s_trackbar(val):
    dst[:,1] = val / s_max * hsv[:,cv2.cvtColor(dst,cv2.COLOR_HSV2BGR))


# Read some input image,and convert to HSV color space
src = cv2.imread('path/to/your/image.png')
hsv = cv2.cvtColor(src,cv2.COLOR_BGR2HSV)
dst = hsv.copy()

# Setup window and create trackbar for the S (saturation) channel
cv2.namedWindow(title_window)
cv2.createTrackbar('S',s_max,on_s_trackbar)

# Show something,cv2.COLOR_HSV2BGR))
cv2.waitKey()

同样,在初始窗口中,只剩下一个用于饱和的跟踪栏:

3

然后,对饱和度进行一些调整会得出:

4

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.5
OpenCV:      4.4.0
----------------------------------------
,

此代码段回答了您的问题吗?

if(getUrlParameter("lname") === 'lname'){
       $(".fname").css({display:'none'});
       $(".lname").css({display:'block'});     
}