2017-09-26 6 views
0

イメージの各ピクセルを変更したい。しかし、結果は私が期待したようなものではありません。OpenCVイメージピクセルを変更する

オリジナル画像:

enter image description here

結果:各ピクセルを変更するForループ

enter image description here

image = imread("image.png", CV_LOAD_IMAGE_COLOR) 
unsigned char value; 

for (int col = 0; col < image.cols; col++){ 
    for (int row = 0; row < image.rows; row++){ 
     value = image.at<unsigned char>(row,col); 
     value *= 0; 
     image.at<unsigned char>(row, col) = value; 
    } 
} 

だから私は間違い知りません私はあなたに尋ねたいあなたは答えを知っています。

答えて

5

3チャネルの符号なしcharイメージでは、行と列をループするときに、を使用して3つのチャネルすべてにアクセスする必要があります。

image = imread("image.png", CV_LOAD_IMAGE_COLOR) 
Vec3b value; 

for (int row = 0; row < image.rows; row++){ 
    for (int col = 0; col < image.cols; col++){ 
     //Vec3b as typename 
     value = image.at<Vec3b>(row,col); 
     value *= 0; 
     image.at<Vec3b>(row, col) = value; 
    } 
} 
+0

同じ操作がすべてのピクセルで行われるため、私は行列式を好むでしょう - より高速で簡潔です。 | OPに0を掛けることを考えると、単純な 'setTo'やスカラーの割り当てだけでも可能です。 –

+0

@DanMašekはい、この操作を実行するには他にも多くの方法があります(例:行列乗算、ビット単位演算、parallel_forなど)。しかし、OPはCVの初心者のようで、各ピクセルへのアクセスに興味があるので、私はそれに応じて回答しました。 – zindarod

関連する問題