나는 톤 커브와 같은 스무드를 실현하고 싶다.OpenCV Tone Curve progrommatically
이미지에 적용해야 할 미리 정의 된 커브 세트가 있습니다. 예를 들어 : 우리가 예를 들어, 새로운 전류 톤 값의 의존성을 볼이 차트에 이해
: 우리가 왼쪽에서 첫 번째 점 얻는 경우에 - 0이 될 것입니다 = 모든 R, G 및 B를 64 으로 변환되거나 224 이상의 모든 값은 0으로 변환되고 요법됩니다. 코드 내가 가지고 여기
과 :
그래서 내가 단순화 된 곡선을했습니다 시험 목적을 위해 새로운 가치에 이미지의 모든 픽셀을 변경하려고
//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];
전용 이미지의 3/4
처리 된 몇 가지 이유 10
그렇지 않은 내가 예상 결과와 일치 : @ACCurrent 의견에
업데이트 0
감사 계산에서 오류가 발견되었지만 (코드 및 이미지가 업데이트 됨) 여전히 처리 된 이미지의 3/4 만 이해하지 못합니다.
'노이즈'가 나타나는 이유를 이해하지 못하고 곡선이 매끄럽지 않기를 바랍니다.
은 .at
작동을 피하는 방법을 찾습니다.
업데이트 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
원본 이미지도 게시 할 수 있습니까? 그리고 'at'기능이 느리지 않기 때문에 걱정하지 마십시오. 아무 문제없이 사용할 수 있습니다. – Miki
@Miki 원래 이미지 추가 – user5599807