2017-02-08 1 views
3

나는 톤 커브와 같은 스무드를 실현하고 싶다.OpenCV Tone Curve progrommatically

이미지에 적용해야 할 미리 정의 된 커브 세트가 있습니다. 예를 들어 : 우리가 예를 들어, 새로운 전류 톤 값의 의존성을 볼이 차트에 이해 enter image description here

: 우리가 왼쪽에서 첫 번째 점 얻는 경우에 - 0이 될 것입니다 = 모든 R, G 및 B를 64 으로 변환되거나 224 이상의 모든 값은 0으로 변환되고 요법됩니다. 코드 내가 가지고 여기

enter image description here

과 :

그래서 내가 단순화 된 곡선을했습니다 시험 목적을 위해 새로운 가치

에 이미지의 모든 픽셀을 변경하려고

//init original image 
cv::Mat originalMat = [self cvMatFromUIImage:inputImage]; 

//out image the same size 
cv::Mat outMat  = [self cvMatFromUIImage:inputImage]; 

//loop throw every row of image 
for(int y = 0; y < originalMat.rows; y++){ 
    //loop throw every column of image 
    for(int x = 0; x < originalMat.cols; x++){ 
    //loop throw every color channel of image (R,G,B) 
    for(int c = 0; c < 3; c++){ 

     if(originalMat.at<cv::Vec3b>(y,x)[c] <= 64) 
     outMat.at<cv::Vec3b>(y,x)[c] = 64 + (originalMat.at<cv::Vec3b>(y,x)[c]) - 
     (originalMat.at<cv::Vec3b>(y,x)[c]) * 2 ; 

     if((originalMat.at<cv::Vec3b>(y,x)[c] > 64)&&(originalMat.at<cv::Vec3b>(y,x)[c] <= 128)) 
     outMat.at<cv::Vec3b>(y,x)[c] = ((originalMat.at<cv::Vec3b>(y,x)[c]) - 64 ) * 4 
     ; 

     if((originalMat.at<cv::Vec3b>(y,x)[c] > 128)) 
     outMat.at<cv::Vec3b>(y,x)[c] = (originalMat.at<cv::Vec3b>(y,x)[c]) + 128 - 
     ((originalMat.at<cv::Vec3b>(y,x)[c]) - 128) * 3; 

    } //end of r,g,b loop 
    } //end of column loop 
} //end of row loop 

//send to output 
return [self UIImageFromCVMat:outMat]; 

하지만 결과는 다음과 같습니다. enter image description here

전용 이미지의 3/4

처리 된 몇 가지 이유 10

그렇지 않은 내가 예상 결과와 일치 : @ACCurrent 의견에 enter image description here

업데이트 0

감사 계산에서 오류가 발견되었지만 (코드 및 이미지가 업데이트 됨) 여전히 처리 된 이미지의 3/4 만 이해하지 못합니다.

'노이즈'가 나타나는 이유를 이해하지 못하고 곡선이 매끄럽지 않기를 바랍니다.

.at 작동을 피하는 방법을 찾습니다.

업데이트 1

원본 이미지 :

enter image description here

+1

opencv'를 사용하지 마십시오.<>'함수에서는 매우 느립니다. 또한 첫 번째 검사에서는'gaussMat.at(y, x) [c]'= 128의 값을 가정합니다. 다음 : 'if ((gaussMat.at (y, x) [c]> 64) && gaussMat.at (y, x) [c] = 128) outMat.at (y, x) [c] = (gaussMat.at (y, x) [c]) - 64 + (gaussMat.at (y, x) [c]) * 4' 그래서 128-64 + 128 * 4는 576과 같습니다. CV_U8c의 최대 값은 255를 넘습니다. 그래서 많은 채도가있을 것입니다. – ACCurrent

+1

원본 이미지도 게시 할 수 있습니까? 그리고 'at'기능이 느리지 않기 때문에 걱정하지 마십시오. 아무 문제없이 사용할 수 있습니다. – Miki

+0

@Miki 원래 이미지 추가 – user5599807

답변

3

당신은 Vec4b


originalMat.typ와 이미지에 액세스해야 E는(), 즉 24

originalMat 형 (24)이며, CV_8UC4 같음. 이것은 이미지에 4 개의 채널이 있음을 의미하지만, 마치 3 개의 채널 만있는 것처럼 마치 Vec3b으로 액세스하고있는 것입니다. 이것은 약 1/4의 이미지가 수정되지 않는 이유를 설명합니다.

코드에있는 Vec3b을 모두 Vec4b으로 바꿉니다.

관련 문제