cvSplit()函数将复制src的各个通道到图像dst0,dst1,dst2和dst3中。如果源图像少于4个通道的情况下,那么传递给cvSplit()的不必要的目标参数可设置为NULL
program cv_Sum;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ocv.highgui_c,
ocv.core_c,
ocv.core.types_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
uResourcePaths;
const
//
filename = cResourceMedia + 'cat2.jpg';
var
img: pIplImage;
channels: array [0 .. 2] of pIplImage;
BGRSum: Array [0 .. 2] of TCvScalar;
i, total: Integer;
begin
try
// 加载图像文件
img := cvLoadImage(filename, 1);
// 创建三个单通道图像,用于分离图像的蓝色、绿色和红色通道
for i := 0 to 2 do
channels[i] := cvCreateImage(cvGetSize(img), 8, 1);
// 将图像分离为三个通道
cvSplit(img, channels[0], channels[1], channels[2]);
// 计算每个通道的像素值之和
for i := 0 to 2 do
BGRSum[i] := cvSum(channels[i]);
// 计算图像的总像素值
total := img^.width * img^.height * 255;
WriteLn('Color percentage of RGB(ex red 50%, green 25% and blue %25) in an image is');
WriteLn('red: ', BGRSum[2].val[0] / total * 100:2:2);
WriteLn('green: ', BGRSum[1].val[0] / total * 100:2:2);
WriteLn('blue: ', BGRSum[0].val[0] / total * 100:2:2);
readln;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.
img^
:这表示你正在访问一个指针所指向的结构体或记录的内容。在这里,img
是一个指向图像数据的指针。img^.width
:这是图像的宽度,以像素为单位。img^.height
:这是图像的高度,以像素为单位。255
:这是灰度图像的每个像素的可能的最大灰度值。
因此,img^.width * img^.height * 255
就是图像中可能的最大灰度值的总数。在灰度图像中,每个像素的灰度值通常介于 0 到 255 之间,因此这个计算就得到了整个图像的所有可能灰度值的总数。