【问题标题】:Processing of several images - standards处理多个图像 - 标准
【发布时间】:2022-01-10 06:42:19
【问题描述】:

我使用图像。我有一个按钮,用于选择 bmp 格式的图像:

if (OpenPictureDialog1->Execute())
{
    Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}

图像显示在TImage 组件中。然后我将图像分成扇区并计算每个扇区中的所有黑点。之后,我收到一个符号向量,并通过除以符号向量中的最大元素来对其进行归一化。然后我将归一化向量的值保存在库 <sysdyn.h> 中的 DynamicArray 中,并将结果打印在 TMemo 组件上:

DynamicArray<double> NormArr1;
NormArr.Length = n;
Memo1->Lines->Add( "Normalized vector is:" );
for (i = 0; i < n; i++)
{
    NormArr[i] = cop[i] / (double) max;
    Memo1->Lines->Add(NormArr[i]);
}
Memo1->Lines->Add( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );

我需要以相同的方式处理多张图像,但在DynamicArray 中只保存一张图像的处理结果。所以我应该点击按钮,选择一个图像并找到它的归一化向量。然后我应该使用相同的按钮选择另一个图像,并找到它的归一化向量。之后,我需要比较这些向量的元素。

最重要的是我应该只使用一个按钮,而不是恰好选择 2 个,而是选择很多图像,然后比较它们的归一化向量。我怎样才能做到这一点?我需要正确实施图像的自我训练。

这是我的表格:

【问题讨论】:

  • @RemyLebeau 你能举个例子吗?
  • @RemyLebeau 或者如果我附上一个项目可能会更好,如果它对你来说不是那么难,你能在我的项目中完全修复它吗?
  • 您对我之前的评论有什么不清楚的地方吗?您在实施它时遇到的问题到底是什么?如果你不知道如何编写一个简单的函数,那么这个任务可能超出你目前的技能。不,我不会为你修复你的项目。这不是这个网站的目的。
  • @RemyLebeau 是的,我真的不明白你的意思
  • 如何使用 win3.11 VCL 组件或 winapi 中的 FileList 来获取所选目录中的文件列表(所有都可以合并到对话框中)然后将其提供给一些 TListBox,您可以在其中选择多个想要的文件...从该过程中处理这些文件,而不是在每个文件上一一使用 TOpenDialog ....如果您想要的不仅仅是 BMP,请参阅opening image file on c++ , PNG , JPEG,您可以将图像和结果打包到单个结构/类中并创建该结构/类的动态列表,以便访问多个图像/结果

标签: c++ arrays image image-processing c++builder


【解决方案1】:

我建议将处理逻辑移到它自己的函数中,该函数将文件名作为输入并返回归一化向量作为输出。然后,当您执行TOpenPictureDialog 时,您可以遍历其Files 属性中的字符串(确保在对话框中启用ofAllowMultiSelect 标志),将每个选定的文件传递给处理函数并保存结果。然后您可以根据需要比较保存的结果。

void __fastcall TMyForm::ButtonClick(TObject* Sender)
{
    if (OpenPictureDialog1->Execute())
    {
        DynamicArray< DynamicArray<double> > AllNormArrs;

        for(int i = 0; i < OpenPictureDialog1->Files->Count; ++i)
        {
            DynamicArray<double> NormArr = normalizeFile(OpenPictureDialog1->Files->Strings[i]);
            // use NormArr as needed...

            AllNormArrs.Length = AllNormArrs.Length + 1;
            AllNormArrs[AllNormArrs.High] = NormArr;
        }

        // compare AllNormArrs elements as needed...
    }
}

DynamicArray<double> __fastcall TMyForm::normalizeFile(String filename)
{
    DynamicArray<double> NormArr;
    // load file, calculate normalized values as needed...
    return NormArr;
}

【讨论】:

  • 谢谢,但我有一些问题: normalizeFile 是一个我可以做任何排列的函数?我可以在那里加载图像吗?将其划分为扇区并在所有计算后通过此函数接收归一化向量?然后我在单击按钮时看到文件(图像)的打开,我不明白这一点。我可以向您展示我的代码的一部分以便更好地解释吗?
  • @Vorrven 是的,您可以在normalizeFile() 中做任何您想做的事情以满足您的需求。编写自己的自定义函数是编程的核心功能,所以我建议你学习如何去做。没有它,你不会走得太远。
  • 我应该也使用那里的OpenFileDialog吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2014-07-30
  • 2014-12-09
相关资源
最近更新 更多