因此,我正在运行一些代码,该代码应允许我先降低饱和度然后饱和图像。我有一个应该允许我执行此操作的函数,但是无论我如何更改代码,它始终会改变颜色,因此不会降低饱和度。
我的职能:
def desaturation(img,percent=.5):
imgGreen=img[:,:,1]
desatGreen=imgGreen*percent
desatImg=img[:,:,:]
desatImg[:,:,1]=desatGreen
return desatImg
每次运行它时,它都会将颜色转换为洋红色,而不是我期望的不饱和外观。我希望颜色范围仍保持在BGR中,而不是其他任何颜色范围。是否有任何代码可以帮助我完成这些工作,而不是依靠另一个内置函数来完成呢?
编辑:我设置了百分比变量,以便它永远不会超过1和永远不会低于0。
编辑:我想降低整个图像的饱和度。我的代码编写方式有点误导。
这是在Python OpenCV中使绿色饱和的一种简单方法。这样做的方法是转换为CMYK,然后使C和Y通道去饱和。不幸的是,OpenCV没有内置的BGR2CMYK颜色转换。因此,需要进行计算。同样,此方法也会影响其他颜色。
输入:
import cv2
import numpy as np
img = cv2.imread("barn.jpg")
scale = 255
percent = 0.5
#percent = 0.25
#percent = 0
# separate b,g,r
b,g,r = cv2.split(img)
b = b.astype(np.float32)
g = g.astype(np.float32)
r = r.astype(np.float32)
# convert to cmyk
# see
# https://stackoverflow.com/questions/14088375/how-can-i-convert-rgb-to-cmyk-and-vice-versa-in-python/41220097
# https://www.codeproject.com/Articles/4488/XCmyk-CMYK-to-RGB-Calculator-with-source-code
c = 1 - r / scale
m = 1 - g / scale
y = 1 - b / scale
k = cv2.min(cv2.min(c, m),y)
c = scale * (c - k) / (1 - k)
m = scale * (m - k) / (1 - k)
y = scale * (y - k) / (1 - k)
# desaturate neighbors of G which are C,Y
c = cv2.multiply(c, percent)
y = cv2.multiply(y, percent)
# convert back to bgr
r = scale * (1.0 - c / scale) * (1.0 - k)
g = scale * (1.0 - m / scale) * (1.0 - k)
b = scale * (1.0 - y / scale) * (1.0 - k)
r = r.clip(0,255).astype(np.uint8)
g = g.clip(0,255).astype(np.uint8)
b = b.clip(0,255).astype(np.uint8)
img_desat = cv2.merge([b,g,r])
# save result
cv2.imwrite('barn_desat_0p5.jpg', img_desat)
#cv2.imwrite('barn_desat_0p25.jpg', img_desat)
#cv2.imwrite('barn_desat_0.jpg', img_desat)
cv2.imshow('img', img)
cv2.imshow('img_desat', img_desat)
cv2.waitKey(0)
cv2.destroyAllWindows()
降低到50%:
降低到25%:
降低到0:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句