我正在尋找分割彩色圖像以嘗試和識別某些功能。如果它不符合某些決策規則,我正在設置一個像素爲黑色,否則我想讓像素與第一次讀取時完全相同。將OpenCV C++中的彩色圖像中的像素(i,j)設置爲黑色
我讀使用圖像:
Mat apples = imread("C:/Users.......", CV_LOAD_IMAGE_COLOR);
我嘗試到目前爲止已經爲在第i行第j列設置一個像素爲黑色:
apples.at<uchar>(i,j) = 0;
其中,當循環在圖像的所有行和列上似乎跳過了圖像的2/3。
我也試過:
Vec3b black;
black[0] = 0;
black[1] = 0;
black[2] = 0;
apples.at<Vec3b>(i,j) = black;
這似乎幾乎過濾圖像。任何幫助,將不勝感激!
編輯我循環圖像矩陣過如下:
for(int i=0;i<apples.rows;i++)
{
for(int j=0;j<apples.cols;j++)
{
if(applescopy[0].at<uchar>(i,j) == 0 || applescopy[1].at<uchar>(i,j) == 0 || applescopy[2].at<uchar>(i,j) == 0)
{
apples.at<Vec3b>(i,j) = black;
}
}
}
如果我消除了「如果」的聲明秒結束,只是設置apples.at UCHAR(我, j)= 0;無條件地,只有圖像的左三分之一會變黑。
編輯2我相信我在原始彩色圖像上使用「分割」似乎修改了原始彩色圖像。我已經做了一個副本,以便在循環中使用,並獲得更多預期的結果,謝謝你們!
請發佈代碼,你說是跳過圖像的2/3rd,所以我們可以幫助你。 – mjuarez
.at(i,j)確實訪問i,j uchar值,如果您有8位灰度圖像,則爲i,j像素,但如果您有彩色圖像,則必須使用3倍的「列」因爲3個uchar值是一個RGB值。最簡單的方法是使用.at (i,j)如果您有3個通道,每個通道8位。 –
Micka