- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
“使用 CImg,编写一个程序来构造一个正方形图像并为每个角分配一种颜色。使用线性插值,对正方形中的每个像素进行填充和着色,使整个着色平滑广场的整个区域"
我很难理解如何为每个角选择颜色,并为正方形填充颜色。下面是我的代码,但似乎随机放置颜色,我无法选择自己的颜色。在我现在拥有的代码下方。
#include <iostream>
#include "CImg/CImg.h"
using namespace cimg_library;
using namespace std;
int main() {
//Create an empty image
CImg<unsigned char> square(255, 255, 1, 3, 0);
for (int i = 0; i < 255; i++){
for(int j = 0; j < 255; j++){
//Red
square(i,j,0,0) = i;
//Green
square(i,j,0,1) = j;
//Blue
square(i,j,0,2) = i;
}
}
//Display and save filtered image
CImgDisplay disp(square);
while (!disp.is_closed())
disp.wait();
square.save("squareInterpolation.bmp");
}
我的代码的结果:
我想要的结果(忽略白色边框):
非常感谢!
最佳答案
目前,您的代码没有进行任何插值——它只是在赋值。插值是指您知道图像极限的某些值并计算这些已知值之间的值(使用公式)以填充未知值。
实际上,CImg
会为您进行插值,恕我直言,优秀的工程师会重复使用和回收经过良好测试的代码,因为它可以降低成本。因此,最简单的解决方案是创建红色、绿色、蓝色和白色角点(插值中的已知值)的 2x2 图像,然后让 CImg
使用插值将图像的大小调整为 255x255。
它可能看起来像这样:
#include <iostream>
#include <cstdlib>
#define cimg_display 0
#include "CImg.h"
using namespace cimg_library;
using namespace std;
#define INTERPOLATION_LINEAR 3
#define INTERPOLATION_CUBIC 5
#define BOUNDARY_DIRICHLET 0
#define BOUNDARY_NEUMANN 1
int main() {
// Create 2x2 image with Red, Green, Blue and White pixels
CImg<unsigned char> image(2,2,1,3,0);
image(0,0,0,0)=255; // top-left is Red
image(1,0,0,1)=255; // top-right is Green
image(0,1,0,2)=255; // bottom-left is Blue
image(1,1,0,0)=255; // bottom-right is white
image(1,1,0,1)=255; // bottom-right is white
image(1,1,0,2)=255; // bottom-right is white
// Let CImg do the interpolation for us - because smart engineers re-use well tested code
CImg<unsigned char> result=image.resize(255,255,-100,-100,INTERPOLATION_LINEAR,BOUNDARY_DIRICHLET);
// Save result image as NetPBM PNM - no libraries required
result.save_pnm("result.pnm");
}
我想这不是您期望的方式,所以我会将该解决方案与我自己实现插值的另一个解决方案结合起来。这是您可能会使用的 Wikipedia article on Bilinear Interpolation 中的公式.
可以这样实现:
#include <iostream>
#include <cstdlib>
#define cimg_display 0
#include "CImg.h"
using namespace cimg_library;
using namespace std;
int main() {
// Create 256x256 image with Red, Green, Blue and White pixels
CImg<unsigned char> image(256,256,1,3,0);
image(0,0,0,0)=255; // top-left is Red
image(255,0,0,1)=255; // top-right is Green
image(0,255,0,2)=255; // bottom-left is Blue
image(255,255,0,0)=255; // bottom-right is white
image(255,255,0,1)=255; // bottom-right is white
image(255,255,0,2)=255; // bottom-right is white
// Fill inner area by interpolation
for(int r=0;r<256;r++){ // "r" for "row"
for(int c=0;c<256;c++){ // "c" for "column"
for(int b=0;b<3;b++){ // "b" for "band" in my head
float oneMinusX=(255-r)/255.0;
float oneMinusY=(255-c)/255.0;
image(r,c,0,b)=image(0,0,0,b)*oneMinusX*oneMinusY +
image(255,0,0,b)*oneMinusY*r/255.0 +
image(0,255,0,b)*oneMinusX*c/255.0 +
image(255,255,0,b)*r*c/(255.0*255.0);
}
}
}
// Save result image as NetPBM PNM - no libraries required
image.save_pnm("result.pnm");
}
关于c++ - 使用CImg使用线性插值填充颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48605392/
我正在使用 CIMG 加载图像,如下所示: CImg image("lena.png"); 我怎么知道例如该图像的四个 channel 代表 RGBA 颜色而不是 CMYK?我知道CImg<>::sp
我正在尝试获取 CImg 的子图像。据我了解,方法 get_crop() 可以满足我的需要,但我获得的子图像不包含我期望它们具有的像素值。 unsigned char* StringTextureGe
我正在使用 Cimg 图形库编写小型 C 程序,需要测试文件是否为图像。 我试图加载文件/图像 CImg srcimg(filename) 并获得豁免,但 cimg 断然退出: convert.im6
*****码***** #include "CImg.h" #include using namespace cimg_library; int main() { CImg image("l
我是第一次使用 CImg 库,我用一个只包含 CImg.h 的简单测试程序遇到了编译错误。这是为什么?我该如何解决这个问题? 程序代码: #include "../headers/CImg.h" us
下面,我有一个使用 CImg 库 (http://cimg.sourceforge.net/) 的简单程序,它遍历图像的像素并根据每个像素的灰度值输出 0 或 1 (浅色或深色)。非常奇怪的是,每次运
我想在我的应用程序中集成用于图像处理的 CImg 库。当我尝试编译示例应用程序时,出现编译时错误。错误消息是这样的。Unresolved inclusion:X11/Xlib.h 当我将 CImg.h
我试图找到 Cimg 库,以便我可以将它添加到我在 Dev-c++ 中的库中,但是 Cimg 中没有名为 lib 的文件夹,所以它叫什么?谢谢。 最佳答案 Follow the CImg tutori
我正在使用 CImgDisplay 在屏幕上显示几张图片。我的问题是它们在命令提示符窗口和彼此之上打开。有没有办法让它们在不同的位置打开?我查看了 CImg 文档,但找不到任何内容。 最佳答案 CIm
我在使用 X11 xGetImage 拍摄快照后创建了一个二进制文件,并将数据字段的内容存储在 binary file 中(文件已压缩,请解压)。现在,我正在尝试使用 CImg 并学习它的用法。 第一
当我使用CImg 加载.BMP 时,如何知道它是灰度图像还是彩色图像?我试过如下,但失败了: cimg_library::CImg img("lena_gray.bmp"); const int sp
我想使用 CImg 库 ( http://cimg.sourceforge.net/ ) 以任意角度旋转图像(图像由不应执行旋转的 Qt 读取): QImage img("sample_with_al
我正在尝试实现光谱方法来计算图像的显着性图,但我似乎无法使逆 FFT 工作。 int main(int argc, char * argv[]) { const char * input_fi
我期待使用 CImg 库绘制一些简单的数学函数(如 y = x^3)。 我尝试使用它,但它总是给我以下错误: 对“SetDIBitsToDevice@48”的 undefined reference
我刚刚安装了 cImg,并开始浏览一些示例文件来让自己适应方向。每个从示例文件夹加载图像的程序都可以正常编译,然后在运行时在命令行窗口中遇到此错误: [instance(0,0,0,0,0000000
我已阅读 CImg documentation 的这一部分: 但是,尚不清楚如何设置此归一化级别(它不是 display() 函数参数)。 谁能告诉我如何使用它们?谢谢! 最佳答案 两种方法: 干净的
我正在尝试从我使用 libnoise 改编的世界生成器生成 map 图 block 。使用 libnoise 保存方法效果很好,但是当尝试使用 CImg 缩放和裁剪图像时,出现以下错误: [CImg]
标题是不言自明的,但我要强调我是 c++ 的初学者,尤其是涉及 CImg 库时。这是我到目前为止的代码,我尝试使用 flipped_idx 进行试验(当合并到代码中时它不起作用)但我认为我没有朝着正确
每当我尝试加载图像时,我都会收到一条错误消息:CImg::load(): Failed to recognize format of file . jpg 和 png 文件都会发生这种情况。 我找到了
我在一个项目中使用 CImg 处理一些不同的事情,并且有一个灰度图像,我需要应用 jet_LUT256 颜色映射。我不确定我是否走在正确的道路上。任何指导将不胜感激。 #include "CImg.h
我是一名优秀的程序员,十分优秀!