1

GPUImage のエッジ検出フィルターから白黒の画像を取得しました。ここで、白はエッジを表し、画像コンテンツの大部分は黒で透明ではありません。問題は、この画像を別の画像の上に重ねて、エッジが下の画像とどのように整列しているかを示すことです。

ただ、非エッジ部分は透明ではなく黒なので、基本的には黒を透明にしたいというか、黒と白の強さを透明の強さに変えて欲しいです。

この変換タスク用の直接 GPUImage フィルターは見つかりませんでした。GPUImageChromaKeyFilter はこれを行う方法のようですが、RGB からアルファ チャネルへの変換以上のものであり、このタスクを意図したものではありません。

4

1 に答える 1

3

編集: ブラッドのコメントのおかげで、チャネルを交換しないより効率的なソリューションは、「gl_FragColor = vec4(vec3(mag), 1.0);」を置き換えることです。「gl_FragColor = vec4(mag);」で エッジ検出フィルター ソースで。

GPUImageColorMatrixFilter のパラメーターを操作して、チャンネルを別のチャンネルにマッピングできます。サンプルコード:

GPUImagePicture *gpuImage = [[GPUImagePicture alloc] initWithImage:image];
GPUImageSobelEdgeDetectionFilter *edgeFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init];

GPUImageColorMatrixFilter *conversionFilter = [[GPUImageColorMatrixFilter alloc] init];
conversionFilter.colorMatrix = (GPUMatrix4x4){
    {0.0, 0.0, 0.0, 1.0},
    {0.0, 0.0, 0.0, 1.0},
    {0.0, 0.0, 0.0, 1.0},
    {1.0,0.0,0.0,0.0},
};

[gpuImage addTarget:edgeFilter];
[edgeFilter addTarget:conversionFilter];
[gpuImage processImage];

return [conversionFilter imageFromCurrentlyProcessedOutputWithOrientation:orientation];

colorMatrix で指定された値は、基本的に、以前のアルファ チャネル (非透過イメージの場合はすべて 255) を使用して RGB チャネルを置き換え、以前の R チャネル (黒と白のイメージは RGB で同じ値を持つ) を使用してアルファ チャネルを置き換えることを示しています。 .

于 2013-05-30T21:01:48.687 に答える