修改亮度、对比度、色调、饱和度,达到预期效果

22 篇文章 0 订阅
3 篇文章 0 订阅

用户态可以通过v4l2自带工具进行一些UVC相机参数的设定,包括采集卡驱动之类,也可以通过v4l2自带工具进行参数设定。

通过修改这些参数的值,可以弥补相机本身彩色部分自带不足。

总的来说就这么几种命令:

查看设备所有参数信息:

v4l2-ctl -d /dev/videoX --list-ctrls

ps:X表示相机挂载的UVC节点号,如0,9之类

一般会显示以下四种参数

                                                   最小   最大     步进   默认    当前

brightness 0x00980900 (int)    : min=0 max=100 step=1 default=50 value=66      #亮度

contrast 0x00980901 (int)    : min=0 max=100 step=1 default=50 value=50         #对比度

saturation 0x00980902 (int)    : min=0 max=100 step=1 default=50 value=50      #饱和度

hue 0x00980903 (int)    : min=0 max=100 step=1 default=50 value=50                #色调

注意:不同驱动、采集卡反馈信息是不一样的,范围也不一样。有些0~100,有些0~255,也有些-128-127  不一样,因此需要先查看下值

查看某个属性值

v4l2-ctl -d /dev/videoX --get-ctrl=brightness

就会返回该参数对应的值

设置摸个属性值

v4l2-ctl -d /dev/videoX --set-ctrl=brightness=30

注意设置值的范围是否超过该参数的范围

这些参数都是可以设置的,

当然前提在拉流之前设置,如果已经开始拉流了,会导致视频流卡住的。


 那么,我们应该如何设置这些参数呢?这些参数有什么关系吗?

先从简单来说,亮度与对比度,这个一般都知道。

如果是在光线不足的情况下,可以提高亮度的值,这样图像就会更加明亮一点(感觉更清晰点)

也可以提高对比度的值,但效果不是一样

当然这个跟实际场景有一定关系,也不能完全一概而论,对于大部分建议60%对比度、40%亮度,这样比较真实点,当然跟相机sensor本身也有很大关系

 说明:对比图片是采用两种不同亮度值(满值100),30的明显暗很多

再来一组对比度的对比图

对比度高的明显“亮”很多

 细心点对比下,对比度70与亮度70,其实也有差别的

同样70,亮度70的要发白一些

从实际肉眼角度来看,对比度70的要比亮度70 更真实一点。

 


另外一组参数,色调与饱和度,色调相当于亮度、饱和度相当于对比度

色调如果过低,那么绿色会变蓝色,色调过高,那么蓝色变成绿色

一般先调色调,把颜色调成一致,然后再调饱和度,

颜色要对比强烈点(更靓丽点),饱和度高一点(过高的话,会偏白色,感觉像是灰蒙蒙一层)

也是同样硬件,采用30 - 70对比

 饱和度对比,30比70的颜色要“暗淡”一些,70的要鲜艳一些

也不是说鲜艳就好,要根据实际情况来适配的,鲜艳的颜色感觉有点失真(假)

关键还是看sensor以及isp处理是否足够优秀,一般来说,最好的(最真实)应该是中间值(50)

色调对比,就更夸张了,颜色都变掉了。不说了,除非sensor 真有问题,否则仅用于微调该参数,不然总有一种颜色是不正常的!!

饱和度70还能基本保持颜色一致,但色调就没办法保证了


通过以上对比,相信有个基本概念,这里也是比较简单粗暴的对比;

当然,要适应全环境还是很难的,算法也很讲究的,需要投入很多精力

实际项目的话,有些特殊环境,比如黑夜无光的时候,把色调调0,这样就可以显示黑白图,也能看清楚一些情况。

当逆光时,也可以调整亮度

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码来实现:import cv2# 读取图像 img = cv2.imread('image.jpg')# 随机选择一种或多种操作来增强图像 choice = np.random.randint(1, 7) if choice == 1: img = cv2.addWeighted(img, 1.2, np.zeros(img.shape, img.dtype), 0, 10) # 调整亮度 elif choice == 2: img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) img[:, :, 1] = img[:, :, 1] * 1.2 # 饱和度 img[:, :, 2] = img[:, :, 2] * 1.2 # 色调 img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR) elif choice == 3: img = cv2.addWeighted(img, 1.2, np.zeros(img.shape, img.dtype), 0, -25) # 对比度 elif choice == 4: x = np.random.randint(-20, 20) y = np.random.randint(-20, 20) M = np.float32([[1, 0, x], [0, 1, y]]) # 随机平移 img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0])) elif choice == 5: angle = np.random.randint(-30, 30) M = cv2.getRotationMatrix2D((img.shape[1] / 2, img.shape[0] / 2), angle, 1) # 旋转 img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0])) elif choice == 6: scale = np.random.uniform(0.7, 1.3) M = cv2.getRotationMatrix2D((img.shape[1] / 2, img.shape[0] / 2), 0, scale) # 缩放 img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))# 保存图像 cv2.imwrite('enhanced_image.jpg', img) ### 回答2: import cv2 import random def adjust_brightness(image, value): hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) v = cv2.add(v, value) v = cv2.add(v, np.where(v > 255, -255, 0)) final_hsv = cv2.merge((h, s, v)) enhanced = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) return enhanced def adjust_saturation(image, value): hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) s = cv2.add(s, value) s = cv2.add(s, np.where(s > 255, -255, 0)) final_hsv = cv2.merge((h, s, v)) enhanced = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) return enhanced def adjust_hue(image, value): hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) h = cv2.add(h, value) h = cv2.add(h, np.where(h > 180, -180, 0)) final_hsv = cv2.merge((h, s, v)) enhanced = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) return enhanced def adjust_contrast(image, value): alpha = float(127 + value) / 127 enhanced = cv2.addWeighted(image, alpha, image, 0, 0) return enhanced def random_translation(image, max_shift): rows, cols, _ = image.shape dx = random.randint(-max_shift, max_shift) dy = random.randint(-max_shift, max_shift) M = np.float32([[1, 0, dx], [0, 1, dy]]) translated = cv2.warpAffine(image, M, (cols, rows)) return translated def random_rotation(image, max_angle): rows, cols, _ = image.shape angle = random.uniform(-max_angle, max_angle) M = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1) rotated = cv2.warpAffine(image, M, (cols, rows)) return rotated def random_scaling(image, min_scale, max_scale): scale = random.uniform(min_scale, max_scale) scaled = cv2.resize(image, None, fx=scale, fy=scale) return scaled def random_image_enhancement(image): operation = random.choice(["brightness", "saturation", "hue", "contrast"]) if operation == "brightness": value = random.randint(-50, 50) enhanced = adjust_brightness(image, value) elif operation == "saturation": value = random.randint(-50, 50) enhanced = adjust_saturation(image, value) elif operation == "hue": value = random.randint(-50, 50) enhanced = adjust_hue(image, value) elif operation == "contrast": value = random.randint(-50, 50) enhanced = adjust_contrast(image, value) else: enhanced = image return enhanced def random_image_transform(image): operation = random.choice(["translation", "rotation", "scaling"]) if operation == "translation": max_shift = min(image.shape[0], image.shape[1]) // 10 transformed = random_translation(image, max_shift) elif operation == "rotation": max_angle = 20 transformed = random_rotation(image, max_angle) elif operation == "scaling": min_scale = 0.5 max_scale = 1.5 transformed = random_scaling(image, min_scale, max_scale) else: transformed = image return transformed # 定义图像路径 image_path = "image.jpg" # 读入图像 image = cv2.imread(image_path) # 进行随机图像增强 enhanced_image = random_image_enhancement(image) # 进行随机图像变换 transformed_image = random_image_transform(enhanced_image) # 保存增强后的图像 cv2.imwrite("enhanced_image.jpg", transformed_image) 以上代码实现了利用OpenCV对图像进行随机亮度饱和度色调对比度调整、随机平移、旋转、缩放等图像增强操作的功能。首先,我们定义了一系列函数来实现不同的图像增强操作,包括调整亮度饱和度色调对比度、随机平移、旋转和缩放等。然后,我们使用random_image_enhancement函数随机选择一种增强操作对图像进行增强,接着再使用random_image_transform函数随机选择一种图像变换操作对增强后的图像进行变换。最后,将增强后的图像保存下来。 ### 回答3: 要使用Python编写OpenCV实现图像增强的代码,可以使用以下示例代码: ```python import cv2 import numpy as np def random_brightness(img, brightness_range): img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) brightness = np.random.uniform(brightness_range[0], brightness_range[1]) img_hsv[:,:,2] = img_hsv[:,:,2] * brightness img_hsv[:,:,2] = np.clip(img_hsv[:,:,2], 0, 255) img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR) return img def random_saturation(img, saturation_range): img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) saturation = np.random.uniform(saturation_range[0], saturation_range[1]) img_hsv[:,:,1] = img_hsv[:,:,1] * saturation img_hsv[:,:,1] = np.clip(img_hsv[:,:,1], 0, 255) img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR) return img def random_hue(img, hue_range): img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hue = np.random.uniform(hue_range[0], hue_range[1]) img_hsv[:,:,0] = img_hsv[:,:,0] + hue img_hsv[:,:,0] = np.clip(img_hsv[:,:,0], 0, 179) img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR) return img def random_contrast(img, contrast_range): contrast = np.random.uniform(contrast_range[0], contrast_range[1]) img = cv2.convertScaleAbs(img, alpha=contrast, beta=0) return img def random_translate(img, translate_range): translate_x = int(np.random.uniform(translate_range[0], translate_range[1])*img.shape[1]) translate_y = int(np.random.uniform(translate_range[0], translate_range[1])*img.shape[0]) translation_matrix = np.float32([[1,0,translate_x],[0,1,translate_y]]) img = cv2.warpAffine(img, translation_matrix, (img.shape[1],img.shape[0])) return img def random_rotate(img, rotate_range): angle = np.random.uniform(rotate_range[0], rotate_range[1]) rotation_matrix = cv2.getRotationMatrix2D((img.shape[1]/2, img.shape[0]/2), angle, 1) img = cv2.warpAffine(img, rotation_matrix, (img.shape[1],img.shape[0])) return img def random_scale(img, scale_range): scale = np.random.uniform(scale_range[0], scale_range[1]) img = cv2.resize(img, None, fx=scale, fy=scale) return img # 读取图像 img = cv2.imread('image.jpg') # 设置增强参数范围 brightness_range = [0.5, 1.5] # 亮度范围 saturation_range = [0.5, 1.5] # 饱和度范围 hue_range = [-10, 10] # 色调范围 contrast_range = [0.8, 1.2] # 对比度范围 translate_range = [-0.2, 0.2] # 随机平移范围 rotate_range = [-30, 30] # 旋转角度范围 scale_range = [0.8, 1.2] # 缩放比例范围 # 随机选择一种或多种增强方式 img = random_brightness(img, brightness_range) img = random_saturation(img, saturation_range) img = random_hue(img, hue_range) img = random_contrast(img, contrast_range) img = random_translate(img, translate_range) img = random_rotate(img, rotate_range) img = random_scale(img, scale_range) # 显示增强后的图像 cv2.imshow('Enhanced Image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码提供了实现亮度饱和度色调对比度、随机平移、旋转、缩放中的任意一种或多种增强的函数,并结合示例图像完成了增强操作。你可以根据需要对各个增强方式的参数范围进行调整,并通过选择对应的函数来实现相应的图像增强效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值