bwlookup(bw,lut)
http://se.mathworks.com/help/images/ref/bwlookup.html
или изнутри, applylut
оба выполняют 2-на-2 или 3-по-3 операции окрестности на бинарном (черный & белого) изображения, в то время как OpenCV-х cv::LUT
выполняет в пиксельное серое преобразование уровня (тесно связано с intlut
в MATLAB). Примером последнего является гамма-коррекция на изображении уровня серого.
//! transforms array of numbers using a lookup table: dst(i)=lut(src(i))
CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst,
int interpolation=0);
Насколько мне известно, не существует окрестность bwlookup
реализации в OpenCV. Однако, следуя описанию MATLAB's bwlookup
, вы можете написать его самостоятельно.
// performs 3-by-3 lookup on binary image
void bwlookup(
const cv::Mat & in,
cv::Mat & out,
const cv::Mat & lut,
int bordertype=cv::BORDER_CONSTANT,
cv::Scalar px = cv::Scalar(0))
{
if (in.type() != CV_8UC1)
CV_Error(CV_StsError, "er");
if (lut.type() != CV_8UC1 || lut.rows*lut.cols!=512 || !lut.isContinuous())
CV_Error(CV_StsError, "lut size != 512");
if (out.type() != in.type() || out.size() != in.size())
out = cv::Mat(in.size(), in.type());
const unsigned char * _lut = lut.data;
cv::Mat t;
cv::copyMakeBorder(in,t,1,1,1,1,bordertype,px);
const int rows=in.rows+1;
const int cols=in.cols+1;
for (int y=1;y<rows;++y)
{
for (int x=1;x<cols;++x)
{
int L = 0;
const int jmax=y+1;
#if 0 // row-major order
for (int j=y-1, k=1; j<=jmax; ++j, k<<=3)
{
const unsigned char * p = t.ptr<unsigned char>(j) + x-1;
for (unsigned int u=0;u<3;++u)
{
if (p[u])
L += (k<<u);
#else // column-major order (MATLAB)
for (int j=y-1, k=1; j<=jmax; ++j, k<<=1)
{
const unsigned char * p = t.ptr<unsigned char>(j) + x-1;
for (unsigned int u=0;u<3;++u)
{
if (p[u])
L += (k<<3*u);
#endif
}
}
out.at<unsigned char>(y-1,x-1)=_lut[ L ];
}
}
}
Я тестировал против remove
и bridge
так должно работать. Надеюсь, это поможет.
Edit: После проверки против случайной таблицы перекодировки,
lut = uint8(rand(512,1)>0.5); % @MATLAB
B = bwlookup(A, lut);
я перевернул порядок индексы появляются в таблице поиска (не имеет значения, если операция является симметричной).
Никто? Я думаю, что человек имел в виду, что он применял операции на первой (0-255) и второй (256-511) половинах гистограммы размером 512 бит (?), Но опять же это догадка с моей стороны, я может быть полностью отключен. Пробовал связаться с этим человеком (sonmi), но он попадает непосредственно в список рассылки @yahoogroups. Может ли кто-нибудь помочь мне с этим? Как использовать Matlab lutarray в openCV для двоичных изображений? – MyBushisaNeonJungle
Пожалуйста, не отрицайте свои собственные сообщения здесь. Мы надеемся, что каждый, у кого есть хороший вопрос, получит ответ, но поскольку 99% людей здесь являются добровольцами, мы не можем этого гарантировать. – halfer
'bwlookup (BW, lut)' или 'applylut' выполняет операцию фильтрации нелинейных окрестностей 2 на 2 или 3 на 3 на двоичном или полутоновом изображении BW, где как' cv :: LUT' является поиском на пиксель таблица операция. Итак, да, вы могли бы разделить изображение на выполнение последнего, но первое упоминание: 'bw = applylut (bw, lut)' в bwmorph.m не может быть реплицировано с использованием 'cv :: LUT' или другой функции OpenCV для акций. – mainactual