假设RGB代表原图像某点的像素值,rgb表示归一化之后的值,则
r = R / (R+G+B);g = G / (R+G+B);b = B / (R+G+B);
实现归一化RGB的方法如下:
//对输入的原始RGB图像获取对应的归一化图像
IplImage*NormalizeImage(IplImage *img)
{
1、创建归一化的图像;
IplImage* imgavg = cvCreateImage(cvGetSize(img),8, 3)
2、获取图像高度和宽度信息,设置epslon的目的是防止除0的操作产生;
int width =
img->widthint height =
img->heightint redValue, greenValue,
blueValuedouble sum, epslon = 0.000001
3、计算归一化的结果,并替换掉原像素值;
for (int y = 0y
<heighty++) {for (int x = 0x <
widthx++) {
CvScalar src = cvGet2D(img, y, x)redValue =
src.val[0]greenValue = src.val[1]blueValue = src.val[2]//
加上epslon,为了防止除以0的情况发生 sum = redValue + greenValue + blueValue +
epslonCvScalar des = cvScalar(redValue / sum * 255, greenValue /
sum * 255, blueValue / sum * 255, src.val[4])cvSet2D(imgavg, y, x,
des)
}}
4、返回归一化后的图像;
return imgavg
}
注意:归一化之后的图像仅使用两个字节便可以表示一个像素值,
r = R/(R+G+B)
g = G/(R+G+B)
b = B/(R+G+B)
b可以表示为:b = 1-R’-G’
物理上,这种变换方式从图像上移除了光照的信息。
通过对图像的RGB色彩空间进行归一化处理,在某些情况下是去除光照和阴影影响的一种简单和有效的方法。假设RGB代表原图像某点的像素值,rgb表示归一化之后的值,则
r = R / (R+G+B);g = G / (R+G+B);b = B / (R+G+B);
实现归一化RGB的方法如下:
//对输入的原始RGB图像获取对应的归一化图像
IplImage*NormalizeImage(IplImage *img)
{
1、创建归一化的图像;
IplImage* imgavg = cvCreateImage(cvGetSize(img),8, 3)
2、获取图像高度和宽度信息,设置epslon的目的是防止除0的操作产生;
int width =
img->widthint height =
img->heightint redValue, greenValue,
blueValuedouble sum, epslon = 0.
3、计算归一化的结果,并替换掉原像素值;
for (int y = 0y
<heighty++) {for (int x = 0x <
widthx++) {
CvScalar src = cvGet2D(img, y, x)redValue =
src.val[0]greenValue = src.val[1]blueValue = src.val[2]//
加上epslon,为了防止除以0的情况发生 sum = redValue + greenValue + blueValue +
epslonCvScalar des = cvScalar(redValue / sum * 255, greenValue /
sum * 255, blueValue / sum * 255, src.val[4])cvSet2D(imgavg, y, x,
des)
}}
4、返回归一化后的图像;
return imgavg
}
注意:归一化之后的图像仅使用两个字节便可以表示一个像素值,
r = R/(R+G+B)
g = G/(R+G+B)
b = B/(R+G+B)
b可以表示为:b = 1-R’-G’
物理上,这种变换方式从图像上移除了光照的信息。
<html><head>
<meta http-equiv="Content-Type" content="text/html charset=utf-8" />
<title>发送</title>
<style type="text/css">
table{
border-collapse:collapse
}
table td {
border: 1px solid #000000
padding: 2px 5px
}
input.warning{
border-color: red
}
</style>
<script type="text/javascript">
String.prototype.padLeft = function (len, charStr) {
return new Array(len - this.length + 1).join(charStr, '') + this
}
function changeBgColor(input){
var rgbInput = document.getElementById("rgb")
var redInput = document.getElementById("red")
var greenInput = document.getElementById("green")
var blueInput = document.getElementById("blue")
var redValue = Number(redInput.value)
var greenValue = Number(greenInput.value)
var blueValue = Number(blueInput.value)
if(redValue < 0 || redValue > 255 || isNaN(redValue))
{
alert("red value invalid")
redInput.className = "warning"
return
}
redInput.className = ""
if(greenValue < 0 || greenValue > 255 || isNaN(greenValue))
{
alert("green value invalid")
greenInput.className = "warning"
return
}
greenInput.className = ""
if(blueValue < 0 || blueValue > 255 || isNaN(blueValue))
{
alert("blue value invalid")
blueInput.className = "warning"
return
}
blueInput.className = ""
document.body.style.backgroundColor = "#" + redValue.toString(16).padLeft(2, '0') + greenValue.toString(16).padLeft(2, '0') + blueValue.toString(16).padLeft(2, '0')
}
</script>
</head>
<body>
<table>
<tr><td>red:</td><td><input type="text" id="red" name="red" onchange="changeBgColor(this)" placeholder="please input 0-255"/></td></tr>
<tr><td>green:</td><td><input type="text" id="green" name="green" onchange="changeBgColor(this)" placeholder="please input 0-255"/></td></tr>
<tr><td>blue:</td><td><input type="text" id="blue" name="blue" onchange="changeBgColor(this)" placeholder="please input 0-255"/></td></tr>
</table>
</body>
</html>
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)