Halcon 中 HImage 为图像的数据结构,本文记录 HALCON 中生成图像的几种方式。
创建图像相关算子
read_image
语法:
1
| read_image( : Image : FileName : )
|
示例:
1 2
| * 读取图像 read_image(Image, 'test.jpg')
|

copy_image
语法:
1
| copy_image(Image : DupImage : : )
|
示例:
1
| copy_image (Image, DupImage)
|

gen_image_const
语法:
1
| gen_image_const( : Image : Type, Width, Height : )
|
示例:
1 2
| * 生成一张灰度为0的单通道图像 gen_image_const(Image, 'byte', 15, 15)
|
gen_image_gray_ramp
$$
ImageGrayRamp(r,c)=Alpha \times (r-row)+Beta \times (c-col) + 平均值
$$
语法:
1
| gen_image_gray_ramp( : ImageGrayRamp : Alpha, Beta, Mean, Row, Column, Width, Height : )
|
- 图像的大小由宽度和高度决定,灰度值的类型为 byte,有效区域外的灰色值会被剪切
- 就是整张图大小为
Width, Height,围绕 Row, Column 为中心,此点均值为 Mean,纵向变化率为 Alpha,横向变化率 Beta,就这么样整个渐变图出来
- 如果数值大于 255 或小于 0 会被置为 255 或 0
- 输出为
byte 格式
示例:
1 2
| * 生成一种灰度渐变的图像 gen_image_gray_ramp (ImageGrayRamp, 0.5, 0.5, 128, 256, 256, 512, 512)
|

gen_image_surface_first_order
- 该函数和
gen_image_gray_ramp 功能几乎一致,只是可以指定图像类型
语法:
1
| gen_image_surface_first_order( : ImageSurface : Type, Alpha, Beta, Gamma, Row, Column, Width, Height : )
|
示例:
1
| gen_image_surface_first_order(ImageGrayRamp2,'real', 0.5, 0.5, 128, 256, 256, 512, 512)
|

gen_image_surface_second_order
$$
\begin{aligned} \text { ImageSurface }(r, c) & =\text { Alpha }(r-\text { Row })^{2} \ & +\operatorname{Beta}(c-\text { Column })^{2} \ & +\operatorname{Gamma}(r-\text { Row }) *(c-\text { Column }) \ & +\operatorname{Delta}(r-\text { Row }) \ & +\operatorname{Epsilon}(c-\text { Column }) \ & +\text { Zeta }\end{aligned}
$$
语法:
1
| gen_image_surface_second_order( : ImageSurface : Type, Alpha, Beta, Gamma, Delta, Epsilon, Zeta, Row, Column, Width, Height : )
|
示例:
1
| gen_image_surface_second_order(ImageGrayRamp3, 'real', 0.5, 0.5, 1, 0.1, 0.1, 128, 256, 256, 512, 512)
|

gen_image_proto
- 生成一张和输入图像一样长宽的指定灰度值的单通道图像
语法:
1
| gen_image_proto(Image : ImageCleared : Grayval : )
|
示例:
1
| gen_image_proto(ImageGrayRamp, ImageCleared, 128)
|
不论输入图像通道数为多少,输出图像均为单通道。
gen_image_interleaved
- 通过一个指向交错像素的图像指针来创建一个三通道图像
- 这个函数比较复杂也比较奇怪,要求输入图像的指针指向交错的图像,例如将 RGB 三通道图像按照 RGB像素的顺序压缩写入单通道图像中,然后再用这个函数解构出来,感觉用处不大
语法:
1
| gen_image_interleaved( : ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow, StartColumn, BitsPerChannel, BitShift : )
|
示例:
1 2 3 4 5 6 7 8
| read_image(Image, 'test.jpg') rgb3_to_interleaved (Image, ImageInterleaved) * 获取指针 get_image_pointer1 (ImageInterleaved, Pointer, TypeRGB, Width, Height) * 恢复 rgb 图像 gen_image_interleaved (BImageRGB1, Pointer, 'rgb', Width / 3, Height, -1, 'byte', 0, 0, 0, 0, -1, 0) * 恢复部分 图像 gen_image_interleaved (BImageRGB2, Pointer, 'rgb', Width / 3, Height, -1, 'byte', Width / 6, Height / 2, 0, Width / 12, -1, 0)
|

- 直观上理解为左边的单通道图(RGB压缩到一行,所以宽三倍)提取组成右边的图
gen_image1
语法:
1
| gen_image1( : Image : Type, Width, Height, PixelPointer : )
|
示例:
1 2 3
| read_image(Image, 'test.jpg') get_image_pointer3(Image, PointerRed, PointerGreen, PointerBlue, Type, Width, Height) gen_image1(ImageBlue, Type, Width, Height, PointerBlue)
|

gen_image1_extern
语法:
1
| gen_image1_extern( : Image : Type, Width, Height, PixelPointer, ClearProc : )
|
示例:
1 2 3 4 5 6 7 8 9 10
| void NewImage(Hobject *new) { unsigned char *image; int r,c; image = malloc(640*480); for (r=0; r<480; r++) for (c=0; c<640; c++) image[r*640+c] = c % 255; gen_image1_extern(new,"byte",640,480,(Hlong)image,(Hlong)free); }
|
gen_image3
语法:
1
| gen_image3( : ImageRGB : Type, Width, Height, PixelPointerRed, PixelPointerGreen, PixelPointerBlue : )
|
示例:
1 2 3
| read_image(Image, 'test.jpg') get_image_pointer3(Image, PointerRed, PointerGreen, PointerBlue, Type, Width, Height) gen_image3(ImageBRG, 'byte', Width, Height, PointerBlue, PointerRed, PointerGreen)
|

gen_image3_extern
语法:
1
| gen_image3_extern( : Image : Type, Width, Height, PointerRed, PointerGreen, PointerBlue, ClearProc : )
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void NewImage(Hobject *new) { unsigned char *image_red; unsigned char *image_green; unsigned char *image_blue; int r,c; image_red = malloc(640*480); image_green = malloc(640*480); image_blue = malloc(640*480); for (r=0; r<480; r++) for (c=0; c<640; c++) { image_red[r*640+c] = c % 255; image_green[r*640+c] = (c+64) % 255; image_blue[r*640+c] = (c+128) % 255; } gen_image3_extern(new,"byte",640,480,(Hlong)image_red,\ (Hlong)image_green,(Hlong)image_blue,(Hlong)free); }
|
gen_image1_rect
- 从像素上的指针创建一个带有矩形域的图像(带存储管理)。
- 函数很危险,不建议使用
语法:
1
| gen_image1_rect( : Image : PixelPointer, Width, Height, VerticalPitch, HorizontalBitPitch, BitsPerPixel, DoCopy, ClearProc : )
|
示例:
1 2 3
| read_image(Image, 'test.jpg') get_image_pointer3(Image, PointerRed, PointerGreen, PointerBlue, Type, Width, Height) gen_image1_rect(Image1, PointerRed, Width, Height, Width, 8, 8, 'false', PointerRed)
|

region_to_bin
语法:
1
| region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )
|
示例:
1 2
| gen_rectangle1 (Rectangle, 30, 20, 100, 200) region_to_bin (Rectangle, BinImage, 255, 0, 400, 400)
|

region_to_label
语法:
1
| region_to_label(Region : ImageLabel : Type, Width, Height : )
|
示例:
1 2
| gen_rectangle1 (Rectangle, 30, 20, 100, 200) region_to_label (Rectangle, BinImage, 'byte', 400, 400)
|
region_to_mean
语法:
1
| region_to_mean(Regions, Image : ImageMean : : )
|
示例:
1 2 3
| read_image(Image, 'test.jpg') gen_rectangle1 (Rectangle, 300, 200, 700, 800) region_to_mean (Rectangle, Image, ImageMean)
|

参考资料
文章链接:
https://www.zywvvd.com/notes/coding/halcon/halcon-image-op/halcon-image-op/