Javascript 自动调整亮度/对比度以从图像中读取文本
我想知道是否有人能给我指出一个正确的方向,使用javascript自动调整手机摄像头拍摄的图像的亮度/对比度,以便更轻松地读取图像中的文本 谢谢你的帮助Javascript 自动调整亮度/对比度以从图像中读取文本,javascript,camera,image-manipulation,Javascript,Camera,Image Manipulation,我想知道是否有人能给我指出一个正确的方向,使用javascript自动调整手机摄像头拍摄的图像的亮度/对比度,以便更轻松地读取图像中的文本 谢谢你的帮助 非常感谢。要自动调整图像,我们可以使用从图像生成的直方图,然后使用阈值找到一个黑白点,用于将像素值缩放到相对端的最大值 在HTML5中,我们需要使用canvas元素来读取像素信息 建立柱状图 直方图是图像中最能代表哪些值的概览。对于亮度对比度,我们感兴趣的是亮度值——像素的感知亮度 luma直方图示例 要计算luma值,我们可以使用REC.7
非常感谢。要自动调整图像,我们可以使用从图像生成的直方图,然后使用阈值找到一个黑白点,用于将像素值缩放到相对端的最大值 在HTML5中,我们需要使用canvas元素来读取像素信息 建立柱状图 直方图是图像中最能代表哪些值的概览。对于亮度对比度,我们感兴趣的是亮度值——像素的感知亮度 luma直方图示例 要计算luma值,我们可以使用REC.709又名BT.709(此处推荐使用)或REC.601公式
Y = 0.299 * R + 0.587 * G + 0.114 * B
我们需要将其转换为整数iluma=Math.roundluma;,否则,我们将很难构建基于整数值[0255]的直方图来存储,请参见下面的示例代码
确定使用哪个范围的策略可能会有所不同,但为了简单起见,我们可以根据两端像素的最小表示选择阈值策略
显示阈值示例的红线
为了找到基于阈值的最暗值,我们将从左向右扫描,当我们得到高于阈值的亮度值时,使用该值作为最小值。如果我们到达中心,甚至只有33%,我们可以中止并默认为0
对于最亮的,我们也会这样做,但从右到左,如果没有找到阈值,则默认为255
当然,你可以为每一个终端使用不同的阈值——这都是一个尝试和错误的游戏,直到你找到适合你场景的东西
我们现在应该有两个值代表最小-最大范围:
scale = 255 / (max - min) * 2
基于阈值的最小-最大范围
缩放通用luma级别
首先,根据最小-最大范围计算我们需要使用的比例因子:
scale = 255 / (max - min) * 2
我们将始终从每个组件中减去min,即使这意味着如果<0,它将被剪裁。将值设置为0。减去后,我们使用比例因子缩放每个分量值。末尾的x2用于补偿luma和实际RGB值之间的变化。像这里的其他值一样使用此值只是一个任意示例
我们对每个像素0剪辑和缩放中的每个组件执行此操作:
component = max(0, component - min) * scale
当图像数据放回时,基于给定的阈值,对比度应为最大
提示
您不必使用整个图像位图来分析直方图。如果你处理的是大的图像源,你不需要太多,因为我们需要的是最亮/最暗的区域,而不是单个像素
您可以使用与图像自身的混合模式(如倍增、增亮、硬光/软光等)来增亮和添加对比度图像。maxH maxH=hgram[i];
}
//将其用作阈值
thold*=最大值;
//查找最小值
fori=0;i<宽度*0.5;i++{
如果hgram[i]>thold{
min=i;
打破
}
}
如果最小值<0,则最小值=0;//未找到,设置为默认值0
//查找最大值
fori=宽度-1;i>宽度*0.5;我-{
如果hgram[i]>thold{
max=i;
打破
}
}
如果max<0 max=255;//未找到,设置为默认255
比例=255/最大-最小*2;//x2用价值补偿游戏
out.innerHTML=Min:+Min+Max:+Max+
比例:+Scale.toFixed1+x;
//缩放所有像素
fori=0;iY = 0.299 * R + 0.587 * G + 0.114 * B
我们需要将其转换为整数iluma=Math.roundluma;,否则,我们将很难构建基于整数值[0255]的直方图来存储,请参见示例代码b
私奔
确定使用哪个范围的策略可能会有所不同,但为了简单起见,我们可以根据两端像素的最小表示选择阈值策略
显示阈值示例的红线
为了找到基于阈值的最暗值,我们将从左向右扫描,当我们得到高于阈值的亮度值时,使用该值作为最小值。如果我们到达中心,甚至只有33%,我们可以中止并默认为0
对于最亮的,我们也会这样做,但从右到左,如果没有找到阈值,则默认为255
当然,你可以为每一个终端使用不同的阈值——这都是一个尝试和错误的游戏,直到你找到适合你场景的东西
我们现在应该有两个值代表最小-最大范围:
scale = 255 / (max - min) * 2
基于阈值的最小-最大范围
缩放通用luma级别
首先,根据最小-最大范围计算我们需要使用的比例因子:
scale = 255 / (max - min) * 2
我们将始终从每个组件中减去min,即使这意味着如果<0,它将被剪裁。将值设置为0。减去后,我们使用比例因子缩放每个分量值。末尾的x2用于补偿luma和实际RGB值之间的变化。像这里的其他值一样使用此值只是一个任意示例
我们对每个像素0剪辑和缩放中的每个组件执行此操作:
component = max(0, component - min) * scale
当图像数据放回时,基于给定的阈值,对比度应为最大
提示
您不必使用整个图像位图来分析直方图。如果你处理的是大的图像源,你不需要太多,因为我们需要的是最亮/最暗的区域,而不是单个像素
您可以使用与图像自身的混合模式(如倍增、增亮、硬光/软光等)来增亮和添加对比度图像。maxH maxH=hgram[i];
}
//将其用作阈值
thold*=最大值;
//查找最小值
fori=0;i<宽度*0.5;i++{
如果hgram[i]>thold{
min=i;
打破
}
}
如果最小值<0,则最小值=0;//未找到,设置为默认值0
//查找最大值
fori=宽度-1;i>宽度*0.5;我-{
如果hgram[i]>thold{
max=i;
打破
}
}
如果max<0 max=255;//未找到,设置为默认255
比例=255/最大-最小*2;//x2用价值补偿游戏
out.innerHTML=Min:+Min+Max:+Max+
比例:+Scale.toFixed1+x;
//缩放所有像素
fori=0;i